惠州企業(yè)自助建站自己怎么創(chuàng)建網(wǎng)站
參照文檔進(jìn)行不系統(tǒng)的整理,看到那寫到那O.o
依賴屬性
DependencyProperty:使用專有字段支持屬性的標(biāo)準(zhǔn)模式的替代方法。
DependencyObject:定義了可以注冊(cè)和擁有依賴屬性的基類。
public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register("IsSpinning", typeof(bool),typeof(MainWindow));public bool IsSpinning
{get => (bool)GetValue(IsSpinningProperty);set => SetValue(IsSpinningProperty, value);
}
屬性及其支持性 DependencyProperty 字段的命名約定非常重要。 字段總是與屬性同名,但其后面追加了 Property 后綴。
個(gè)人注解:WPF簡(jiǎn)直是個(gè)神奇的軟件,包括MVVM中,竟然是靠View和ViewModel命名差一個(gè)Model完成綁定,當(dāng)然也可以指定綁定的位置。
小點(diǎn):依賴屬性包裝器
不是附加屬性的 WPF 依賴屬性通過實(shí)現(xiàn) get 和 set 訪問器的 CLR 包裝器進(jìn)行公開。 get 和 set 訪問器通過DependencyObject.GetValue 和 DependencyObject.SetValue 調(diào)用與底層屬性系統(tǒng)交互,并以參數(shù)的形式傳入依賴屬性標(biāo)識(shí)符。 依賴屬性的使用者通常不會(huì)直接調(diào)用GetValue 或 SetValue,但如果要實(shí)現(xiàn)自定義依賴屬性,則會(huì)在包裝器中使用這些方法。
注冊(cè)屬性:
請(qǐng)?jiān)陬惖闹黧w中(但在任何成員定義之外)調(diào)用 Register 方法。在以下示例中,Register 的第一個(gè)參數(shù)將依賴屬性命名為 AquariumGraphic。
// Register a dependency property with the specified property name,
// property type, owner type, and property metadata. Store the dependency
// property identifier as a public static readonly member of the class.
public static readonly DependencyProperty AquariumGraphicProperty =DependencyProperty.Register(name: "AquariumGraphic",propertyType: typeof(Uri),ownerType: typeof(Aquarium),typeMetadata: new FrameworkPropertyMetadata(defaultValue: new Uri("http://www.contoso.com/aquarium-graphic.jpg"),flags: FrameworkPropertyMetadataOptions.AffectsRender,propertyChangedCallback: new PropertyChangedCallback(OnUriChanged)));// Declare a read-write property wrapper.
public Uri AquariumGraphic
{get => (Uri)GetValue(AquariumGraphicProperty);set => SetValue(AquariumGraphicProperty, value);
}
依賴屬性默認(rèn)單向綁定OneWay,但是可設(shè)置為雙向綁定TwoWay,或者直接設(shè)置默認(rèn)綁定時(shí)TwoWay。
只讀依賴屬性
最經(jīng)典的IsMouseOver
特點(diǎn)是
:無法賦值,不能綁定,不能用于動(dòng)畫,不能驗(yàn)證等;
主要目的是
結(jié)合屬性觸發(fā)器 (Trigger) 來實(shí)現(xiàn)樣式的切換。
設(shè)置只讀屬性如下:
一、注冊(cè)
// 只讀屬性的定義與注冊(cè)//在元數(shù)據(jù)的實(shí)例中給這個(gè)只讀屬性設(shè)置默認(rèn)值為 false。因?yàn)橐婚_始并沒有選擇文件,當(dāng)選擇文件時(shí),該實(shí)例獲得為trueprivate static DependencyPropertyKey IsFilePickedPropertyKey = DependencyProperty.RegisterReadOnly("IsFilePicked", typeof(bool), typeof(FilePicker), new PropertyMetadata(false));public static DependencyProperty IsFilePickedProperty = IsFilePickedPropertyKey.DependencyProperty;
**注:**創(chuàng)建只讀依賴屬性的過程在許多方面類似于創(chuàng)建讀寫依賴屬性,但有以下區(qū)別:
1.注冊(cè)只讀屬性時(shí),需要調(diào)用 RegisterReadOnly 而不是 Register。
2.實(shí)現(xiàn) CLR 屬性包裝器時(shí),請(qǐng)確保它沒有公共 set 訪問器。
3.RegisterReadOnly 返回 DependencyPropertyKey 而不是 DependencyProperty。 將 DependencyPropertyKey 存儲(chǔ)在非公共類成員中
二、CLR包裝
// 只讀屬性的包裝
//由于這是個(gè)只讀屬性,所以只需要 get 段就可以public bool IsFilePicked{get { return (bool)GetValue(IsFilePickedProperty); }}
三、通過DependencyPropertyKey賦值
使用 SetValue 方法來賦值,SetValue 有兩個(gè)重載,要為只讀屬性賦值,需使用第二個(gè)
SetValue(DependencyPropertyKey key, object value)
就像下邊這個(gè)
SetValue(IsFilePickedPropertyKey, true);
四、應(yīng)用部分
模板中增加以下 XAML 代碼,即可:
<ControlTemplate.Triggers><Trigger Property="IsFilePicked" Value="True"><!--顯示綠色邊框--><Setter Property="BorderBrush" Value="Green" /><Setter Property="BorderThickness" Value="2" /></Trigger></ControlTemplate.Triggers>
依賴屬性over 0.0
XAML
標(biāo)記擴(kuò)展
是一個(gè) XAML 語言概念。 用于提供特性語法的值時(shí),大括號(hào)({ 和 })表示標(biāo)記擴(kuò)展用法。 此用法指示 XAML 處理不要像通常那樣將特性值視為文本字符串或者可轉(zhuǎn)換為字符串的值。
WPF 應(yīng)用編程中最常用的標(biāo)記擴(kuò)展是 Binding
(用于數(shù)據(jù)綁定表達(dá)式)以及資源引用 StaticResource 和 DynamicResource
。 通過使用標(biāo)記擴(kuò)展,即使屬性通常不支持特性語法,也可以使用特性語法為屬性提供值。 標(biāo)記擴(kuò)展經(jīng)常使用中間表達(dá)式類型實(shí)現(xiàn)一些功能,例如,推遲值或引用僅在運(yùn)行時(shí)才存在的其他對(duì)象。
such as:
<Window x:Class="index.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Window1" Height="100" Width="300"><Window.Resources><SolidColorBrush x:Key="MyBrush" Color="Gold"/><Style TargetType="Border" x:Key="PageBackground"><Setter Property="BorderBrush" Value="Blue"/><Setter Property="BorderThickness" Value="5" /></Style></Window.Resources><Border Style="{StaticResource PageBackground}"><StackPanel><TextBlock Text="Hello" /></StackPanel></Border>
</Window>
其中,一般將<Window.resources></Window.resources>
中的單獨(dú)建一個(gè)xaml存貯,作為一種固定風(fēng)格,方便其他頁面的其他控件引用,簡(jiǎn)化代碼量。
這里是一些xaml的擴(kuò)展文檔。
X:命名
x:Key:
為 ResourceDictionary(或其他框架中的類似字典概念)中的每個(gè)資源設(shè)置唯一的鍵。 在典型的 WPF 應(yīng)用標(biāo)記中的所有 x: 用法中,x:Key 可能占到 90%。
x:Class:
向?yàn)?XAML 頁提供代碼隱藏的類指定 CLR 命名空間和類名。 必須具有這樣一個(gè)類才能支持每個(gè) WPF 編程模型的代碼隱藏,因此即使沒有資源,也幾乎總是能看到映射的 x:。
x:Name:
處理對(duì)象元素后,為運(yùn)行時(shí)代碼中存在的實(shí)例指定運(yùn)行時(shí)對(duì)象名稱。 通常,經(jīng)常為 x:Name 使用 WPF 定義的等效屬性。 此類屬性特定映射到 CLR 后備屬性,因此更便于進(jìn)行應(yīng)用編程,在應(yīng)用編程中,經(jīng)常使用運(yùn)行時(shí)代碼從初始化的 XAML 中查找命名元素。 最常見的此類屬性是 FrameworkElement.Name。 在特定類型中不支持等效的 WPF 框架級(jí) Name 屬性時(shí),仍然可以使用 x:Name。 某些動(dòng)畫方案中會(huì)發(fā)生這種情況。
x:Static:
啟用一個(gè)返回靜態(tài)值的引用,該靜態(tài)值不是與 XAML 兼容的屬性。
x:Type:
根據(jù)類型名稱構(gòu)造 Type 引用。 用于指定采用 Type(例如 Style.TargetType)的特性,但屬性經(jīng)常具有本機(jī)的字符串到 Type 的轉(zhuǎn)換功能,因此使用 x:Type 標(biāo)記擴(kuò)展用法是可選的。
其他的
應(yīng)用程序或程序集中的自定義類
XAML有兩種方法:在代碼隱藏或其他生成主 Windows Presentation Foundation (WPF) 應(yīng)用程序的代碼內(nèi)和
在單獨(dú)程序集中作為類(例如用作類庫的可執(zhí)行文件或 DLL)
(1)在應(yīng)用程序中定義自定義類的優(yōu)點(diǎn)在于此方法相對(duì)輕量,可減少在主應(yīng)用程序可執(zhí)行文件外引入單獨(dú)程序集時(shí)遇到的部署和測(cè)試問題。
(2)創(chuàng)建類庫的優(yōu)點(diǎn)在于可在多個(gè)不同的應(yīng)用程序間共享任意此類自定義類。 通過使用單獨(dú)的庫,更易于控制應(yīng)用程序的版本控制問題,并可簡(jiǎn)化類創(chuàng)建過程,在此過程中,所需的類用法是作為 XAML 頁面上的根元素。
無論定義在相同還是不同的程序集中,自定義類若要在 XAML 中用作元素,都需要在 CLR 命名空間和 XML 命名空間之間進(jìn)行映射。