有极少数的XAML元素存在下面所描述的情况就是其自身的属性大多数情况下是在其它的元素中进行声明和使用的该元素本身却很少使用这些属性这些在其它元素中声明和使用的属性我们称为附加属性一般来说附加属性是用于在一个父元素定位其它元素布局的就像Grid和DockPanel元素就包含附加属性Grid使用附加属性来指定包含子元素的特定行和列而DockPanel使用附加属性是来指定子元素应该停靠在面板中的何处位置 提示我们可以在所有的由DependencyObject派生出的元素中设置附加属性而DependencyObject又是由UIElement派生的所以绝大多数的XAML元素都可以使用附加属性 我们说过附加属性是在另外一个元素中进行声明的而其本身是属于所引用的元素为此它在XAML中的声明语法为属性提供元素名属性名例如Grid有两个附加属性Row和Column如果我们要将某个元素包含在Grid的特定区域中你可以在该元素中使用GridRow和GridColumn两个属性附加属性指定确切的行和列下面的代码描述了上述的实现 <Page xmlns= WindowTitle=GridSample> <Grid VerticalAlignment=Top HorizontalAlignment=Left ShowGridLines=True Width= Height=> <GridColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </GridColumnDefinitions> <GridRowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> </GridRowDefinitions> <TextBlock FontSize= FontWeight=Bold GridColumnSpan= GridRow=> Products Shipped </TextBlock> <TextBlock FontSize= FontWeight=Bold GridRow= GridColumn=> Quarter </TextBlock> <TextBlock FontSize= FontWeight=Bold GridRow= GridColumn=> Quarter </TextBlock> <TextBlock FontSize= FontWeight=Bold GridRow= GridColumn=> Quarter </TextBlock> <TextBlock GridRow= GridColumn=></TextBlock> <TextBlock GridRow= GridColumn=></TextBlock> <TextBlock GridRow= GridColumn=></TextBlock> <TextBlock FontSize= FontWeight=Bold GridColumnSpan= GridRow=> Total Units: </TextBlock> </Grid> </Page> 最终的呈现效果如下 绑定属性 在ASPNET中我们通常使用<%# 数据表达式%>这样的语法创建服务器控件属性和数据源之间的绑定那么要在WPF中创建一个XAML元素的属性和数据源之间的绑定应该怎么实现呢?为此我们引入了一种新的概念-绑定属性我们可以在一个元素中使用绑定属性去引用原本属于其它元素的属性值这个包含绑定属性的元素称为目标元素而被引用的那个元素称为源元素注意绑定属性必须和目标元素的从属属性相关联 我们在目标元素中使用绑定属性来绑定源元素的相应属性值如果源元素中的相应属性值在程序运行时发生了变化那么目标元素中的从属属性的属性值也将做出同样改变也就说绑定属性会自动解析所绑定的属性值是否发生了变化并将发生的改变马上反馈到从属属性中在学习C#时我们通常会使用如下的代码来说明赋值的意义 int a = ; int b; b = a; 其中变量a就相当于我们上述的源元素那样其值为而变量b就相当于目标元素那样通过语句b=a将值绑定到b使得变量b的值现在也为但是它和实际的WPF程序中的绑定语法不同的是当a的值发生改变后b的值是不会发生改变的依然为 而WPF中的绑定语法会根据源元素的属性值改变做出同样的响应这种关联是一直持续的在XAML中是使用Binding关键字来维续它们的一致性 Binding元素的语法如下 <Binding ElementName[元素名]= … Path[属性名]=…/> 我们用Binding关键字来表明这是一个绑定表达式语法使用这种语法的实现都会在运行阶段进行实时的解析以获得源元素的当前值 在前面我们曾经创建了一个实例就是你点击了多少次按钮就会在按钮上的文本进行呈现现在我们来使用绑定属性来扩展这个示例我们可以为该页面添加一个TextBox元素使得文本框中文本和一个TextBlock元素上的文本一致也就是说将TextBox元素的Text属性和TextBlock元素的Text属性进行绑定当你点击按钮时就使得上述的两个文本信息同时发生变化并且文本信息会显示改变的次数 <Window xmlns= xmlns:x= x:Class=SDKSampleWindow Width= Height= Title=BindDPtoDP> <DockPanel Background=White> <Button Click=btnChangeSource Width= Height= DockPanelDock=Top>Change Source Property</Button> <TextBlock Name=Text DockPanelDock=Top FontSize= Height= Foreground=Green> <TextBlockText> Click the Button to Change this Initial Text Value in this Source Element </TextBlockText> </TextBlock> <TextBox DockPanelDock=Top Height= Foreground=Blue> <TextBoxText> <Binding ElementName=Text Path=Text/> </TextBoxText> </TextBox> </DockPanel> </Window> 在第行代码处可以看到我们在<TextBoxText>从属属性中使用了绑定表达式语法来绑定TextBlock元素的Text属性 对应的代码后置文件 using System; using SystemComponentModel; using SystemWindows; using SystemWindowsControls; using SystemWindowsDocuments; using SystemWindowsData; using SystemWindowsMedia; namespace SDKSample { /// <summary> /// Window: This is the class that encapsulates the code /// behind the WindowXaml page /// </summary> public partial class Window : Window { static int iCount = ; void btnChangeSource(object sender RoutedEventArgs e) { iCount++; TextText = stringFormat(New Text Count={} iCount); } } } 效果下图所示只要你点击按纽 TextBox元素的Text属性值和TextBlock元素的Text属性值都将发生变化 |