• 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

  • 相关阅读:
    Linux基础之文件管理(高级)上等相关内容-96
    Linux基础之文件管理(基础)等相关内容-95
    Linux基础之初识shell之系统命令基础等相关内容-94
    Linux基础之操作系统启动流程等相关内容-93
    人常犯的三种愚蠢
    数据挖掘科学家
    记住
    但行好事,莫问前程
    记住发生在身上的事,不要小心眼--活的明白
    语言要简洁
  • 原文地址:https://www.cnblogs.com/candyzhmm/p/6931909.html
Copyright © 2020-2023  润新知