日期:2014-05-20  浏览次数:20873 次

wpf换肤
需求:WPF中,点界面中的按钮 ,变化界面背景图片.

我把背景图片bg_red.JPG,bg_blue.JPG,放在两个单独的资源文件中:RedSkin.xaml和BlueSkin.xaml

RedSkin.xaml内容:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- 应该在此定义资源字典条目。-->
<ImageBrush x:Key="bgBlue" Stretch="Fill" ImageSource="Images/bg_red.JPG" />
</ResourceDictionary>

BlueSkin.xaml内容:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- 应该在此定义资源字典条目。-->
<ImageBrush x:Key="bgRed" Stretch="Fill" ImageSource="Images/bg_blue.JPG" />
</ResourceDictionary>


点击button事件中,怎么添加代码?.(点btnRedSkin,背景图变为bg_red.JPG;点btnBlueSkin,背景图变为bg_blue.JPG)




------最佳解决方案--------------------
比较通用的方法是利用WPF的DynamicResource。
做法如下:
比如你要改换当前Window的Background。
首先,你要在Window的xaml文件里面加上这句话
Background="{DynamicResource bg}",因为这里使用的Key值是bg,这要求你需要把所有Skin里面的
x:Key使用同样的字符串,比如你需要把RedSkin.xaml里面的bgBlue改为bg,把BlueSkin.xaml里面的bgRed改为bg;
其次,一般来说你需要为你的程序写一个默认的皮肤,比如写这样一个DefaultSkin.xaml,里面定义了一个黄色的画刷作为默认的皮肤,你也可以使用RedSkin、BlueSKin之一作为默认的皮肤
DefaultSkin.xaml代码如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <SolidColorBrush Color="Yellow" x:Key="bg"/>
</ResourceDictionary>

接着,你需要在程序开始的时候把默认的皮肤加载进去,这部分放在Window的构造函数里去做比较合适,代码如下:

public Window1()
        {
            InitializeComponent();
            ResourceDictionary rd = new ResourceDictionary();
            rd.Source = new Uri(@"DefaultSkin.xaml", UriKind.Relative);
            Application.Current.Resources = rd;
        }

当你点击Button进行换成红色皮肤时代码如下(换成蓝色皮肤一样):

private void bgRed_Click(object sender, RoutedEventArgs e)
        {
            ResourceDictionary rd = new ResourceDictionary();
            rd.Source = new Uri(@"RedSkin.xaml", UriKind.Relative);
            Application.Current.Resources = rd;
        }



------其他解决方案--------------------
顶起,关注---

------其他解决方案--------------------
友情up
jf
------其他解决方案--------------------
还真没弄过 你搜搜看看有什么wpf的皮肤软件没
------其他解决方案--------------------
感谢zyntl的热心回答.您提供的思路很清楚。谢谢。结贴

我昨晚问题自己也想到了解决办法,原理应该一样,代码稍为有区别,我是利用WPF的DynamicResource,在Click事件中,直接指定桌面背景=资源名,通过Application.Current.Resources[]。
------其他解决方案--------------------