《深入淺出WPF》讀書筆記


依賴屬性:
  1. 節省實例對內存的開銷;
  2. 屬性值可以通過Binding依賴到其他對象上。
WPF中,依賴對象的概念被DependencyObject類實現,依賴屬性被DependencyProperty類實現。
BindingOperations.SetBinding(stu,Student.NameProperty,binding); //綁定方式1
textBox1.SetBinding(); //綁定方式2(FrameworkElement類才有的方法)
-------------------------------------------------------------------------------------------------
路由事件
Windows是消息驅動的操作系統,運行在上面的程序也遵循這個機制運行。
CLR事件模型:本質上是一個使用event修飾的委托實例;事件的擁有者就是事件的發送者(Sender)
this.myButton.Click = new EventHandler(this.myButton.Click);/ /CLR事件模型中確定訂閱關系的代碼。
WPF路由事件模型:路由事件的事件擁有者和事件響應者之間沒有顯式的訂閱關系,事件的擁有者只負責激發事件,事件有誰響應他並不知道。事件的響應者則安裝有事件檢測器,針對某類事件進行監聽。當然WPF仍然支持傳統的直接事件模型。
調用源自UIElement類的AddHandler()方法,把監聽的事件和事件的處理器關聯起來:
this.gridRoot. AddHandler(Button.ClickEvent,new RoutedEventHandler(this.Button.Clicked));
 
RoutedEventArgs的 SourceOriginalSource:
路由事件是沿着VisualTree傳遞的(而不是LogicalTree)
Source屬性表示LogicalTree上消息的源頭;(LogicalTree的葉子節點是構成用戶界面的控件)
OriginalSource屬性表示VisualTree上消息的源頭;(VisualTree連控件中細微的結構也算上)
 
---------------------------------------------------------------------------------------------------
WPF命令
事件和命令的區別在於命令具有約束力,比如“保存”命令,可以控制事件處理程序的處理邏輯。
WPF命令系統的幾個基本要素:
  1. 命令,實現IComamnd接口,或者直接是RoutedCommand類
  2. 命令源,實現IComamndSource接口,Button,MenuItem,ListBoxItem都實現了這個接口
  3. 命令目標,實現IInputCommand接口
  4. 命令關聯,負責將一些外圍的邏輯與命令關聯起來,比如執行命令后還進行哪些后續操作。
-----------------------------------------------------------------------------------------------------
WPF資源
WPF不但支持程序級的傳統資源,同時還推出獨具特色的 對象級資源,每個界面元素都可以攜帶自己的資源並可以被自己的子級元素共享。比如說模板,程序樣式,主題就經常放在對象級資源中。
 
首先在XAML中添加名稱空間引用:xmlns:sys="clr-namespace:System;assembly=mscorlib"
示例:
<Window x:Class="" xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Window.Resources>
<sys:String x:Key="str">
華中師范大學
</sys:String>
<sys:String x:Key="dbl">
3.1415926
</sys:String>
</Window.Resources>
<StackPanel>
<TextBlock Text="{ StaticResource ResourceKey=str }">
</TextBlock>
</StackPanel>
</Windows>
 
  • 在C#代碼中使用定義在XAML代碼里的資源:
string text = (string)this.FindResource("str");
//string text =(string)this.Resources["str"];
this.textbox1.Text = text;
 
  • WPF中可將資源放在獨立的資源中,供多個界面重用:
<Window.Resources>
<ResourceDictionary Source="ShineRed.xaml" >
</ResourceDictionary>
</Window.Resources>
 
靜態資源和動態資源:
StaticResource 是指程序載入內存對資源的一次性使用,之后就不再去訪問這個資源;
DynamicResource 是指程序使用過程中還會使用的資源。
 
向WPF程序添加二進制資源(非WPF資源):
  1. 添加Resource.resx文件
  2. 添加xmlns:prop="clr-namespace:wpfapplication.Properties"
  3. <TextBlock Text="{x:Static prop:Resource.UserName}"></TextBlock>
-----------------------------------------------------------------------------------------------------------------
WPF模板
WPF中的模板分為兩類:
  1. ControlTemplate(決定控件長什么樣)
  2. DataTemplate(決定數據顯示成什么樣)
 
注冊轉換器:
public class AutoMakerToLogoPathConverter: IValueConverter
{
public object Convert()
{
return new BitmapImage(new Uri(uripath,UriKind.Relative))
}
public object ConvertBack()
{
throw new NotImplementedException();
}
}
 
把Convert以資源的形式放在字典里:
<Window.Resources>
< local: AutoMakerToLogoPathConverter x:Key="abc" />
<local:NameToPhotoPathConverter x:Key="n2p" />
</Window.Resources>
 
定義數據模板並使用轉換器:
<DataTempalte x:Key="carDetailViewTemplate">
<Image Source="{Binding Name, Converter={StaticResource n2p } }";
</DataTempalte>
 
設置DataTemplate中的DataType屬性(把數據模板應用到某個數據類型上):
<DataTemplate DataType="{x:Type local:Unit}">
 
依賴屬性:一種可以自己沒有值,通過使用Binding從數據源獲得值的屬性。擁有依賴屬性的對象叫做依賴對象(Denpendency Object)。依賴屬性可以節省實例對內存的開銷。
為依賴屬性添加了CLR屬性包裝后,其就具有了扮演數據源和數據目標的雙重角色的能力。另外,盡管依賴屬性所對應的依賴對象沒有實現INotifyPropertyChanged接口,但是當屬性發生改變時與之關聯的Binding對象依然可以得到通知,依賴屬性天生就是合格的數據源。
-------------------------------------------------------------------------------------------------------------------
附加屬性:一個屬性本來不屬於某一個對象,但由於某種需求而后來被附加上。附加屬性本質上是依賴屬性。附加屬性的作用是將屬性與數據類型解耦,讓數據類型的設計更加靈活。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM