临摹对象《Creating a Skinned User Interface in WPF

目标:动态变更窗口的底色(当然,可以扩展为其他元素的样式)
思路:
  •   创建两个资源文件(Resource Dictionary),一个用来存放默认样式(Default.xaml),一个用来存放其他样式(HotHot.xaml);
  •   在需要变更样式的窗体中(本例中为:WinWords),使用动态样式(... Style="{DynamicResource styleBcakground}")
  •   在Application类中(方便调用),添加一个应用样式的公共方法(ApplySkin)
  •   在主窗体中(本例是在WinWords窗体中通过按钮点击事件)调用Application中应用样式方法(ApplySkin)
  •   在本例中,WinWords窗体启动时,自动调用了ApplySkin方法来应用默认的样式(Default)

OK,代码如下:
<HOME_DIR>\Resources\Skins\Default.xaml
 1     <!-- Background Style -->
 2     <Style x:Key="styleBackground">
 3         <Setter Property="Control.Background">
 4             <Setter.Value>
 5                 <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
 6                     <GradientStop Color="LightSkyBlue" Offset="0" />
 7                     <GradientStop Color="WhiteSmoke" Offset="0.5" />
 8                     <GradientStop Color="LightSkyBlue" Offset="1" />
 9                 </LinearGradientBrush>
10             </Setter.Value>
11         </Setter>
12     </Style>

<HOME_DIR>\Resources\Skins\HotHot.xaml
 1WPF:换肤基础(临摹贴)    <!-- Background Style -->
 2WPF:换肤基础(临摹贴)    <Style x:Key="styleBackground">
 3WPF:换肤基础(临摹贴)        <Setter Property="Control.Background">
 4WPF:换肤基础(临摹贴)            <Setter.Value>
 5WPF:换肤基础(临摹贴)                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
 6WPF:换肤基础(临摹贴)                    <GradientStop Color="#50000000" Offset="0.5" />
 7WPF:换肤基础(临摹贴)                    <GradientStop Color="#ff999999" Offset="1" />
 8WPF:换肤基础(临摹贴)                </LinearGradientBrush>
 9WPF:换肤基础(临摹贴)            </Setter.Value>
10WPF:换肤基础(临摹贴)        </Setter>
11WPF:换肤基础(临摹贴)    </Style>

<HOME_DIR>\WinWords.xaml
1WPF:换肤基础(临摹贴)WPF:换肤基础(临摹贴)
2WPF:换肤基础(临摹贴)    <Grid Style="{DynamicResource styleBackground}">
3WPF:换肤基础(临摹贴)WPF:换肤基础(临摹贴)

<HOME_DIR>\WinWords.xaml.cs
 1WPF:换肤基础(临摹贴)        public WinWords()
 2WPF:换肤基础(临摹贴)        {
 3WPF:换肤基础(临摹贴)            InitializeComponent();
 4WPF:换肤基础(临摹贴)            
 5WPF:换肤基础(临摹贴)            this.ApplySkin("Default");
 6WPF:换肤基础(临摹贴)        }
 7WPF:换肤基础(临摹贴)
 8WPF:换肤基础(临摹贴)        private void ApplySkin(string pstrDictPath)
 9WPF:换肤基础(临摹贴)        {
10WPF:换肤基础(临摹贴)            string skinDictPath = @".\Resources\Skins\" + pstrDictPath + @".xaml";
11WPF:换肤基础(临摹贴)            Uri skinDictUri = new Uri(skinDictPath, UriKind.Relative);
12WPF:换肤基础(临摹贴)
13WPF:换肤基础(临摹贴)            MyCcApp app = Application.Current as MyCcApp;
14WPF:换肤基础(临摹贴)            app.ApplySkin(skinDictUri);
15WPF:换肤基础(临摹贴)        }
16WPF:换肤基础(临摹贴)        private void btnTestSkining_Click(object sender, RoutedEventArgs e)
17WPF:换肤基础(临摹贴)        {
18WPF:换肤基础(临摹贴)            this.ApplySkin("HotHot");
19WPF:换肤基础(临摹贴)        }


<HOME_DIR>\MyCcApp.xaml.cs
 1WPF:换肤基础(临摹贴)        public void ApplySkin(Uri skinDictionaryUri)
 2WPF:换肤基础(临摹贴)        {
 3WPF:换肤基础(临摹贴)            ResourceDictionary skinDict = Application.LoadComponent(skinDictionaryUri) as ResourceDictionary;
 4WPF:换肤基础(临摹贴)
 5WPF:换肤基础(临摹贴)            Collection<ResourceDictionary> mergedDicts = base.Resources.MergedDictionaries;
 6WPF:换肤基础(临摹贴)
 7WPF:换肤基础(临摹贴)            if (mergedDicts.Count > 0)
 8WPF:换肤基础(临摹贴)            {
 9WPF:换肤基础(临摹贴)                mergedDicts.Clear();
10WPF:换肤基础(临摹贴)            }
11WPF:换肤基础(临摹贴)
12WPF:换肤基础(临摹贴)            mergedDicts.Add(skinDict);
13WPF:换肤基础(临摹贴)        }

哪里是关键大家自然一看就清楚了,查查MSDN,O了,^_^

相关文章: