熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

XAML入門之附加屬性和綁定屬性

2013-11-13 09:45:09  來源: .NET編程 
有極少數的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屬性值都將發生變化



From:http://tw.wingwit.com/Article/program/net/201311/11493.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.