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


免責聲明!

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



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