1. 程式人生 > >WPF學習一:XAML的資源(Resources)結構

WPF學習一:XAML的資源(Resources)結構

pac logs value 改變 linear sha -a writer arp

一個初學者,把知識做個積累,如果有不對的地方,還請高手指出,謝謝!

先看一段代碼:(下面是以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)結構