WPF學習一:XAML的資源(Resources)結構
一個初學者,把知識做個積累,如果有不對的地方,還請高手指出,謝謝!
先看一段代碼:(下面是以Window WPF進行講解,如果是Web 的話就把<Window改為<Page 而如果是 UserControl 的話,就改成<UserControl ... )
<Window x:Class="brush.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Window.Resources > <Style x:Key="ButtonStype" TargetType="Button" > <Setter Property="BorderBrush"> <Setter.Value> <SolidColorBrush Color="Red" Opacity="0.5" /> </Setter.Value> </Setter> <Setter Property="Width" Value="100" /> <Setter Property="Height" Value="100" /> </Style> </Window.Resources> <Grid > <Button BorderThickness="10" Margin="125,85,53,77" Style="{StaticResource ButtonStype }">Clik Me</Button> </Grid> </Window>
上面代碼中用Window.Resources 定義一個Window級的Resources ,這只是一種以Window級的資源的定義.
其實Resources的定義可以在每一個容器控件中,(或者是在每一個控件,在Template 中可以用到),像C#中變量的定義一樣,Resource的定義的地方不同
也就決定它的作用範圍,如:
Window.Resources它的作用範圍就是在Window容器裏的所有子控件有效,也只有這些只控件才能引用/調用這些資源
Grid.Resources它的作用範圍就是在Grid容器裏的所有子控件有效,也只有這些只控件才能引用/調用這些資源
以此類推....
請註意:Window不是最上層的"容器",最上層的應該是Appication ,所以Application.Resources 的作用範圍更大(有人把Application.Resource叫作全局資源,所有在這個Application下的容器控件等都可以使用,常用來做一個應該程序的Skin ,其ResourceDictionary定義的資源也類似
(<<我眼裏的XAML結構框架>>概括為:"一個Application下有多個Window ,一個Window下有一個Grid,一個Grid下有很多布局容器,這些容器裏面有好子容器或控件 ,控件裏面有Template,template裏面又可以裏Grid…… ")
在我們敬愛的包包的Blog寫到:"綁定後,從底層向上開始找數據源,直到發現位置為止,最上層是<Window>” 不知道是是理解的不對,還是其它的(請包老師指點一下)
我認為最上層應該是Application
<Application x:Class="brush.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Startup="MyApplication_Startup" > <Application.Resources> <LinearGradientBrush x:Key="GrayBlueGradientBrush" StartPoint="0,0" EndPoint="1,1"> <LinearGradientBrush.GradientStops> <GradientStop Color="DarkGray" Offset="0" /> <GradientStop Color="#CCCCFF" Offset="0.5" /> <GradientStop Color="DarkGray" Offset="1" /> </LinearGradientBrush.GradientStops> </LinearGradientBrush> ......
當一個控件綁定了Resources 時,它是從本身所在的容器所定義的資源往上找,直到找到,找到後就不再往上找,最上層就是Application.Resources
對於Application.Resources動態改變資源還有以下幾點:
請註意綁定的時候要用DynamicResource而進綁定而不能是上面的StaticResource (這兩個的區別是:StaticResource是在編譯時綁定,而DynamicResource
在需要是去綁定,具體請看後面寫的"XAML的標誌擴展")
1,不只是在定義了<Application的xaml裏可以定義Resources 還定用下面的方法來加ResourceDictionary裏的資源
ResourceDictionary: Resources/myStyle.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <!-- 以下和 object.Resources的寫法一樣--> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="12" /> </Style> .....
在需要換膚的代碼中寫:
Uri skinDictUri = new Uri("Resources/myStyle.xaml", UriKind.Relative); // Tell the Application to load the skin resources. DemoApp app = Application.Current as DemoApp; app.ApplySkin(skinDictUri);
或者是這樣寫:
private void ChangeSkin(object sender, ExecutedRoutedEventArgs e) { ResourceDictionary rd = new ResourceDictionary(); rd.MergedDictionaries.Add(Application.LoadComponent (new Uri("Resources/myStyle.xaml", UriKind.Relative)) as ResourceDictionary); Application.Current.Resources = rd; // save the skin setting appSettings.Skin = e.Parameter as string; appSettings.Save(); }
另外一種Resources.Add(此方法不僅可以應用到Application.Resources中,還可以應該到Window Controls 的Resources中去) window.Resources.Add("borderBrush", new SolidColorBrush(Color.FromRgb(255, 0, 0)));
轉:http://www.cnblogs.com/CsharpBlog/archive/2009/10/14/1583481.html
WPF學習一:XAML的資源(Resources)結構