WPF学习笔记--XAML

XAML基础:

XAML是一种基于XML语法、专门用于表示一颗.NET对象树的语言。XAML文档中所有的元素都映射为一个.NET类的实例。

View Code
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        
    </Grid>
</Window>

  这是一个XAML的基本框架,文档中包含了两个元素,顶级的一个Window的元素,以及一个Grid的元素,Window元素代表整个窗口,Grid元素中可以放置各种控件,WPF只使用:Window元素、Page元素(该元素和Window元素类似,但可以用于导航的应用程序)、Application元素(该元素定义应用程序资源和启动设置)。

  上面的文档定义了2个命名空间,xmlns专门用于声明命名空间。第一个是WPF核心命名空间。第二个是XAML的命名空间,其中这个命名空间被映射为x。这样可以用这个前缀来使用这个命名空间。比如(<x:ElementName>)。

  当创建了一个WindowsApplication的程序,会有一个基本的框架类:

View Code
namespace WpfStudy {
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }
    }
}

  这个中间的InitializeComponent()方法,这是一个默认的构造函数,当创建类的一个实例时,就会调用此方法,从程序集中提取编译过的XAML,并用它构建用户界面。在类中经常希望通过代码来操作控件,则控件必须包含XAML Name特性。比如上面的Grid控件,需要通过选择该网格通过Properties设置,或直接<Grid x:Name="grid1"></Grid>来操作。这样就可以通过代码来操作这个Grid控件。

XAML属性:

View Code
<Grid>
    <TextBox Name="txtQuestion" VerticalAlignment="Stretch" 
                 HorizontalAlignment="Stretch" FontFamily="Verdana" FontSize="24" Foreground="Green">
    </TextBox>
    <Button Name="btnAnswer">
    </Button>
    <TextBox Name="txtAnsewer">
    </TextBox>
 </Grid>

可以在最基础的Grid中,添加了一个TextBox且设计了一些简单属性,在XML中这些都是一个纯文本的字符串,但对象属性可以是任何.NET类型,通过类型转换器来转换为特定的数据类型。

用类型转换器不能解决所有的问题,有些属性是完备的对象,这些对象具有自己的一系列属性。使得转换起来比较麻烦,容易出错。所以可以使用复杂属性:属性元素语法。例如Grid控件有一个Background属性,在该属性允许提供一个控制背景区域的画刷,但要是想用一个复杂的画刷,则添加一个Grid.Background的子标签。

下面这段代码就是使用了复杂属性,设置了一个渐变的Background。这样的使用比较简单。

View Code
 <Grid>
        <Grid.Background>
            <LinearGradientBrush>
                <LinearGradientBrush.GradientStops>
                    <GradientStop Offset="0.00" Color="Red" />
                    <GradientStop Offset="0.50" Color="Orange" />
                    <GradientStop Offset="1.00" Color="Yellow" />
                </LinearGradientBrush.GradientStops>
            </LinearGradientBrush>
        </Grid.Background>
  </Grid>

  对于大多数的属性,上面2个属性可以工作的非常好,但是有些情况下,如希望将属性值设置为一个已经存在的对象,或者绑定到另一个控件来动态设置属性值。这样就需要用到标记扩展。标记扩展可用于潜逃标签或者XML特性中。当用于特性中,它们是被花括号{}来围起来。使用{标记扩展类 参数}的语法。所有标记扩展都继承自System.Window.Markup.MarkupExt-ention基类的类实现。例如可以像下面这样为Button.Foreground属性使用StaticExtension标记扩展:

View Code
    <Button>
        <Button.Foreground>
            <x:Static Member="SystemColors.ActiveCaptionBrush"></x:Static>
        </Button.Foreground>
    </Button>

  除了普通的属性外,还包含一个附加属性的概念,是可以用于多个控件但在另一个类中定义的属性。经常用于控件的布局。其工作原理为,每一个控件都有自己的固有属性。当在容器中放置一个控件时,根据容器的类型控件会获得额外的特征。这些附加的细节使用附加属性设置。附加属性总是使用两个部分的命名形式:定义类型.属性名。这样区分出附加属性和普通属性。通过附加属性可以再网格中的各个地方放置各种控件。如下面的代码就设置了一个两行三列的一个Grid,然后在想要放置的位置(Grid.Row="N" Grid.Column="N")放置了一个TextBox和两个Button:

View Code
 <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBox Margin="10" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">This is a Test</TextBox>
        <Button Margin="10,10,2,10" Padding="3" Grid.Row="1" Grid.Column="1">OK</Button>
        <Button Margin="0,10,12,10" Padding="3" Grid.Row="1" Grid.Column="2" Width="48">Cancel</Button>
    </Grid>

但附加属性不是真正的属性,它们实际上被转换为方法调用。它们充当一个通用的可扩展系统。例如通过把ROW属性定义为一个附加属性,可以确保任何控件都可以使用它。另一个选择是将该属性作为基类的一部分。

  特殊字符以及空白字符的使用—在用XAML时,它受到XML的规则限制,一些如&、<>的字符。如果试图使用这些字符设置一个元素,就会遇到许多麻烦,所以只有使用实体引用来代替那些字符,才能正确的使用字符。 如:特殊字符小于号(<)转换为字符实体&lt; 大于号(>)转换为&gt; &符号(&)转换为&amp; 引号(")转换为&quot; 除了特殊字符,另一个问题是空白字符,如果希望在按钮文本中包含一系列空格。这时需要为元素使用xml:space="preserve"特性。就能够将元素内所有的空白字符保留下来。

  最后放一个完整的示例:

 

<Window x:Class="WPFTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="328" Width="412">
    <Grid Name="grid1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="132*" />
            <ColumnDefinition Width="95*" />
            <ColumnDefinition Width="163*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
            <Grid.Background>
            <LinearGradientBrush>
                <LinearGradientBrush.GradientStops>
                    <GradientStop Offset="0.00" Color="Red" />
                    <GradientStop Offset="0.50" Color="Indigo" />
                    <GradientStop Offset="1.00" Color="Violet" />
                </LinearGradientBrush.GradientStops>
            </LinearGradientBrush>
        </Grid.Background>
        <TextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
                 Margin="10,10,13,10" Name="txtquestion" TextWrapping="Wrap" FontFamily="Verdana" 
                 FontSize="24" Grid.ColumnSpan="3">
            [Place question here.]
        </TextBox>
        <Button VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,0,0,0" 
                Width="127" Height="23" Name="cmdAnswer" Click="cmdAnswer_Click" Grid.ColumnSpan="2" Grid.Row="1">
            Ask the eight ball
        </Button>
        <TextBox VerticalAlignment="Stretch"  HorizontalAlignment="Stretch"
                 Margin="10,10,13,10" Name="txtAnswer" TextWrapping="Wrap" IsReadOnly="True"
                 FontFamily="Verdana" FontSize="24" Foreground="Green"
                 Grid.ColumnSpan="3" Grid.Row="2">
            [Answer will appear here.]
        </TextBox>
    </Grid>
</Window>

  

  

  

posted @ 2012-05-13 11:39  世界很灰暗  阅读(319)  评论(0编辑  收藏  举报