一個初學者,把知識做個積累,如果有不對的地方,還請高手指出,謝謝!
先看一段代碼:(下面是以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
