WPF编程笔记 0:WPF概况(上部分)

.NET技术的发展总是能给我们带来新的学习动力,在学习完了WF和WCF之后,我开始WPF的学习旅程,WPF没有太多的中文资料,我于是参考Chris Sells, Ian Griffiths编写的《Programming WPF 2nd Edition》写一些笔记和总结,希望能给看此文的你带来一些参考。

 

言归正传,WPF是继MFC技术,WinForm技术的最新Windows层现技术,擅长于Windows平台的用户界面显现,加入了3D等效果, 统一了 Windows 创建、显示和操作文档、媒体和用户界面 (UI) 的方式,使开发人员和设计人员可以创建更好的视觉效果、不同的用户体验。

 

以下是百度百科对WPF的描述:

Windows Presentation Foundation 由两个主要部分组成:引擎和编程框架。

  • Windows Presentation Foundation 引擎。Windows Presentation Foundation 引擎统一了开发人员和设计人员体验文档、媒体和 UI 的方式,为基于浏览器的体验、基于窗体的应用程序、图形、视频、音频和文档提供了一个单一的运行时库。Windows Presentation Foundation 使得应用程序不仅能够充分利用现代计算机中现有的图形硬件的全部功能,而且能够利用硬件将来的进步。例如,Windows Presentation Foundation 的基于矢量的呈现引擎使应用程序可以灵活地利用高 DPI 监视器,而无需开发人员或用户进行额外的工作。 同样,当 Windows Presentation Foundation 检测到支持硬件加速的视频卡时,它将利用硬件加速功能。

  • Windows Presentation Foundation 框架。Windows Presentation Foundation 框架为媒体、用户界面设计和文档提供的解决方案远远超过开发人员现在所拥有的。Windows Presentation Foundation 的设计考虑了可扩展性,使开发人员可以完全在 Windows Presentation Foundation 引擎的基础上创建自己的控件,也可以通过对现有 Windows Presentation Foundation 控件进行再分类来创建自己的控件。Windows Presentation Foundation 框架的核心是用于形状、文档、图像、视频、动画、三维以及用于放置控件和内容的面板的一系列控件。这些“自有控件”为开发下一代用户体验提供了构造块。

WPF另一个特点是还引入了 XAML,这是一种公开表示 Windows 应用程序用户界面的标记语言,可使开发人员和设计人员用来构建和重用 UI 的工具更加丰富。对于 Web 开发人员,XAML 提供了熟悉的 UI 说明模式。XAML 还使 UI 设计从基础代码中分离出来,从而使开发人员和设计人员之间的合作更加紧密。

 

WPF的特性简单介绍:

1. WPF应用程序建立在WPF引擎上,引用WPF提供的公共类库。

2. WPF前台层现以XAML语言曾现,后台逻辑类似ASP.NET的后台逻辑文件xaml.cs文件。

3. WPF程序有两种类型:桌面应用程序(Winform的后代),XAML Browser Applications (XBAPs)(也就是SilverLight)

4. Content Model:与Winform程序不同,WPF采用内容模式显示UI,WPF UI继承只在标签内可以包含任何内容,包括文字,图片或是其他控件,如:

<Window ...>
<Button Width="100" Height="100">Hi</Button>
</Window>

 

 <Window ...>
<Button Width="100" Height="100">
<Image Source="tom.png" />
</Button>
</Window>

Button控件继承只ContentControl,它有一个Content属性作为ContentControl渲染内容的属性,所以上面的代码等同于以下的代码:

<Window ...>
<Button Width="100" Height="100" Content="Hi"></Button>
</Window>

5. XAML Property Element(属性元素):仔细阅读上面的代码我们会发现,Content属性并不能满足第二个例子的情况,Image控件不能直接写到Content属性中去,这就是属性元素的用途所在,它的语法是嵌套的Element.Property格式,所以上面两个例子可以写为:

<Window ...>
<Button Width="100" Height="100">

<Button.Content>Hi</Button.Content>

</Window>

 

<Button Width="100" Height="100">
<Button.Content>
<Image Source="tom.png" />
</Button.Content>
</Button>

 属性元素尤其用于在Content比较复杂的情况,比如多个控件或是Collection情况,当然本例子不能直接在<Button.Content>放两个以上的控件,需要放两个以上控件的复杂情况需要搭配panel控件进行,后续会详细介绍。

6.Layout(布局):在Winform程序中我们使用坐标来定位控件的位置,还有anchor和dock等属性进行特殊的设置,在Webform中我们一般采用流模式,从左到右从上到下的顺序再搭配CSS样式来布局,在WPF中我们可以有新的布局方式:

Canvas
可以把Canvas比作一个坐标系,所有的元素通过设置坐标来决定其在坐标系中的位置.这个坐标系的原点并不是在中央,而是位于它的左上角.当窗体大小变化时,子控件的位置并不会发生变化。


DockPanel
控件的布局根据某个边界来定位,类似于Winform中的Dock属性。


Grid
控件的布局通过行和列来定位。

  • WPF中的Grid的每一个单元格中可以放置多个控件,但控件可能会层叠在一起
  • WPF中的Grid支持单元格的合并,类似于HTML中的table td中的rowspan和colspan
  • Grid中的行和列可以自定义高度(Height)和宽度(Width)
    在设置高度和宽度时可以采用两种写法:
    1)Height=”60”:不加“星号”表示固定的高度
    2)Height=”60*”:加“星号”表示“加权”的高度,在调整窗体大小时,此高度或宽度会按窗体大小改变的比例进行缩放

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="60" />
        <RowDefinition Height="202*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Button Grid.Column="0" Grid.Row="0" Height="30" VerticalAlignment="Top">ButtonA</Button>
    <Button Grid.Column="0" Grid.Row="0" Height="30" VerticalAlignment="Bottom">ButtonB</Button>
    <Button Grid.Column="1" Grid.Row="0">ButtonC</Button>
    <Button Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2">ButtonD</Button>
</Grid>

 

UniformGrid
同Grid,只不过它和Grid不同的是,Grid单元格设置比较灵活可以大小不同可以合并,UniformGrid的单元格的大小是相同的。

<UniformGrid>
    <Button Content="ButtonA" />
    <Button Content="ButtonB" />
    <Button Content="ButtonC" />
    <Button Content="ButtonD" />
    <Button Content="ButtonE" />
    <Button Content="ButtonF" />
    <Button Content="ButtonG" />
    <Button Content="ButtonH" />
</UniformGrid>


StackPanel
StackPanel是以堆叠的方式显示其中的控件,通过Orientation设置横向排列或是竖向排列 


WrapPanel
以流的形式由左到右,由上到下显示控件,其功能类似于WebForm中的流模式

 

7.数据处理:提供数据的绑定控件,数据显示模板控件。

8.XAML Markup Extensions(标记扩展):

Markup Extensions 与TypeConverter 差不多,允许扩展Xaml表达式,把Xaml中的文本转换成相应的对象/对象程序。

例如:

<TextBox.Text>
<Binding Path="Name" />
</TextBox.Text>
用扩展方式可以简化写为:具体语法后续会详细描述
<TextBox Text="{Binding Path=Name}" />

9.Dependency Properties(依赖属性):依赖属性可以被其他类访问的属性,例如

<Rectangle Height="72" Width="131" Canvas.Left="74" Canvas.Top="77" />

  其中,高(Height)和宽(Width)是这个长方体对象的普通属性。但是,顶部(Canvas. Top)和左侧(Canvas. Left)就是依赖属性。因为它们都属于Canvas类。却被用来指定长方形在画布(Canvas)中的位置。

10.Resources(资源):在Winform和WebForm中我们通常将js文件,图片文件或其他文件编译成资源发布给用户使用,在WPF中也是如此,只是他的开发格式稍微不同:

<Window ... xmlns:local="clr-namespace:DataBindingDemo" />
<Window.Resources>
    <local:Nicknames x:Key="names">
        <local:Nickname Name="Don" Nick="Naked" />
        <local:Nickname Name="Martin" Nick="Gudge" />
        <local:Nickname Name="Tim" Nick="Stinky" />
    </local:Nicknames>
</Window.Resources>
<DockPanel DataContext="{StaticResource names}">
    <TextBlock DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center">Name: </TextBlock>
<TextBox Text="{Binding Path=Name}" />
<TextBlock VerticalAlignment="Center">Nick: </TextBlock>
<TextBox Text="{Binding Path=Nick}" />
</TextBlock>
    ...
</DockPanel>
</Window>

 

其中 Window.Resources是声明资源的关键字,我们建立了一个NickNames的集合作为资源,包含了3个名字和昵称的元素,通过StaticResource属性的引用,我们可以在后台访问资源:(通过FindResource方法)

public partial class Window1 : Window
{
    Nicknames names;
    public Window1()
    {
        InitializeComponent();
        this.addButton.Click += addButton_Click;
        // get names collection from resources
        this.names = (Nicknames)this.FindResource("names");
        // no need to make data available for binding here
        //dockPanel.DataContext = this.names;
    }
    void addButton_Click(object sender, RoutedEventArgs e)
    {
        this.names.Add(new Nickname());
    }
}

 

 

 

转载于:https://www.cnblogs.com/leochu2008/archive/2010/02/28/1673082.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值