zoukankan      html  css  js  c++  java
  • 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>
    

      

      

      

  • 相关阅读:
    2009 中国软件技术英雄会
    《致加西亚的信》一书中的一个隐蔽错误
    英文版XP不能打开带有中文路径的chm文件的解决办法
    NetBeans 时事通讯(刊号 # 49 Mar 17, 2009)
    对《致加西亚的信》的异议
    NetBeans 时事通讯(刊号 # 49 Mar 17, 2009)
    Linux运行时I/O设备的电源管理框架
    groovy正则提取完整版本
    Linux 流量监控软件 NetHogs
    Re: 在北京待着到底为了什么
  • 原文地址:https://www.cnblogs.com/socialdk/p/2494823.html
Copyright © 2011-2022 走看看