看了一篇博客,觉得样式很好看,就自己动手做了一下,做个总结。

效果:

  

选择不同的图片背景就会改变:

直接上代码:

每个Theme对应一张图,除了图的名称不同之外,Theme?.xaml中的内容相同:

  1. <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  2. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  3.  
  4. <ImageBrush x:Key="WindowBack" ImageSource="../Images/Theme1.jpg" Stretch="UniformToFill"/>
  5.  
  6. </ResourceDictionary>

Theme1.xaml

窗口的背景为动态资源,且有一个默认值在App.xaml中(<ResourceDictionary Source="Themes/Theme3.xaml"/>):

  1. <Window x:Class="ChangeTheme.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="800" Width="800" WindowStyle="None" WindowState="Maximized"
  5. Background="{DynamicResource WindowBack}">
  6. <Window.Resources>
  7. <ResourceDictionary>
  8. <Style x:Key="ScrollViewerStyle1" TargetType="{x:Type ScrollViewer}">
  9. <Setter Property="Template">
  10. <Setter.Value>
  11. <ControlTemplate TargetType="{x:Type ScrollViewer}">
  12. <Grid>
  13. <Path Data="M101,0.5 L112,11.5 194.5,11.5 C197.26142,11.500001 199.5,13.738577 199.5,16.500001 L199.5,155.5 C199.5,158.26143 197.26142,160.5 194.5,160.5 L5.5,160.5 C2.7385788,160.5 0.5,158.26143 0.5,155.5 L0.5,16.500001 C0.5,13.738577 2.7385788,11.500001 5.5,11.5 L89.999999,11.5 z"
  14. Fill="White" Stretch="Fill" Stroke="SeaGreen" StrokeThickness="0.5">
  15. <!--B27A7A7A-->
  16. <Path.Effect>
  17. <DropShadowEffect Opacity="0.7" ShadowDepth="2" Direction="310"/>
  18. </Path.Effect>
  19. </Path>
  20. <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  21. </Grid>
  22. </ControlTemplate>
  23. </Setter.Value>
  24. </Setter>
  25. </Style>
  26. </ResourceDictionary>
  27. </Window.Resources>
  28. <Grid Height="320" Width="400" HorizontalAlignment="Right" VerticalAlignment="Top">
  29.  
  30. <ScrollViewer Width="350" Style="{DynamicResource ScrollViewerStyle1}" >
  31. <WrapPanel Margin="15,50" x:Name="ImagePanel">
  32. </WrapPanel>
  33. </ScrollViewer>
  34. </Grid>
  35. </Window>

MainWindow.xaml

  1. public partial class MainWindow : Window
  2. {
  3. public MainWindow()
  4. {
  5. InitializeComponent();
  6. LoadBackgroundImages();
  7. }
  8.  
  9. private void LoadBackgroundImages()
  10. {
  11. string path = @"../../Images";
  12. var images =Directory.GetFiles(System.IO.Path.Combine(path)) ;
  13. if (images.Length == ) return;
  14.  
  15. foreach (var img in images)
  16. {
  17. Image imgTheme = new Image()
  18. {
  19. Width = ,
  20. Stretch = Stretch.Fill,
  21. Height = ,
  22. Margin = new Thickness()
  23. };
  24. imgTheme.Name = System.IO.Path.GetFileNameWithoutExtension(img);
  25. imgTheme.Tag = img;
  26. imgTheme.Source = new BitmapImage(new Uri(img, UriKind.Relative));
  27. imgTheme.MouseLeftButtonDown += new MouseButtonEventHandler(imgTheme_MouseLeftButtonDown);
  28. ImagePanel.Children.Add(imgTheme);
  29. }
  30. }
  31.  
  32. private void imgTheme_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  33. {
  34. Image image = sender as Image;
  35. if (image != null && image.Source != null)
  36. {
  37. string imgName = image.Name;
  38. ResourceHelper.LoadResource("pack://application:,,,/ChangeTheme;component/Themes/" + imgName + ".xaml");
  39. }
  40.  
  41. }
  42. }

MainWindow.cs

  1. static class ResourceHelper
  2. {
  3. public static void LoadResource(string fileName)
  4. {
  5. try
  6. {
  7. Application.Current.Resources.MergedDictionaries[] = new ResourceDictionary()
  8. {
  9. Source = new Uri(fileName, UriKind.RelativeOrAbsolute)
  10. };
  11. }
  12. catch (Exception ex)
  13. {
  14. return;
  15. }
  16. }
  17. }

ResourceHelper.cs

WPF:换肤的更多相关文章

  1. WPF换肤之八:创建3D浏览效果

    原文:WPF换肤之八:创建3D浏览效果 上节中,我们展示了WPF中的异步以及界面线程交互的方式,使得应用程序的显示更加的流畅.这节我们主要讲解如何设计一个具有3D浏览效果的天气信息浏览器. 效果显示 ...

  2. WPF换肤之六:酷炫的时区浏览小精灵

    原文:WPF换肤之六:酷炫的时区浏览小精灵 由于工作需要,经常要查看到不同地区的 当前时间,以前总是对照着时区表来进行加减运算,现在有了这个小工具以后,感觉省心了不少.下面是软件的截图: 效果图赏析 ...

  3. WPF换肤之七:异步

    原文:WPF换肤之七:异步 在WinForm时代,相信大家都遇到过这种情形,如果在程序设计过程中遇到了耗时的操作,不使用异步会导致程序假死.当然,在WPF中,这种情况也是存在的,所以我们就需要寻找一种 ...

  4. WPF换肤之四:界面设计和代码设计分离

    原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...

  5. WPF换肤之五:创建漂亮的窗体

    原文:WPF换肤之五:创建漂亮的窗体 换肤效果 经过了前面四章的讲解,我们终于知道了如何拖拉窗体使之改变大小,也知道了如何处理鼠标事件,同时,也知道了如何利用更好的编写方式来编写一个方便实用和维护的换 ...

  6. WPF换肤之三:WPF中的WndProc

    原文:WPF换肤之三:WPF中的WndProc 在上篇文章中,我有提到过WndProc中可以处理所有经过窗体的事件,但是没有具体的来说怎么可以处理的. 其实,在WPF中,要想利用WndProc来处理所 ...

  7. WPF换肤之二:可拉动的窗体

    原文:WPF换肤之二:可拉动的窗体 让我们接着上一章: WPF换肤之一:创建圆角窗体 来继续. 在这一章,我主要是实现对圆角窗体的拖动,改变大小功能. 拖动自绘窗体的步骤 首先,通过上节的设计,我们知 ...

  8. WPF换肤之一:创建圆角窗体

    原文:WPF换肤之一:创建圆角窗体 我们都期望自己的软件能够有一套看上去很吸引人眼球的外衣,使得别人看上去既专业又有美感.这个系列就带领着大家一步一步的讲解如何设计出一套自己的WPF的窗体皮肤,如果文 ...

  9. 有点激动,WPF换肤搞定了!

    一如既往没废话! wpf桌面应用开发都是window内引入很多个UserControl. 如果你有通过不同颜色来换肤的需求,那么下面我就将整个过程! 分2个步骤: 1.主窗体背景色替换: 2.同时界面 ...

随机推荐

  1. jquery怎么跳出当前的each循环

    有些朋友可能会以为在jquery跳出循环可以直接使用continue和break了,但是使用之后没有效果,因为在jquery中没有这两条命令. 后来上网查了下,得到了结果: return false; ...

  2. TCP状态变迁图

    服务端,端口的状态变化 先在本机(IP地址为:192.168.1.10)配置FTP服务,然后在其它计算机(IP地址为:192.168.1.1)访问FTP服务,从TCPView看看端口的状态变化. 下面 ...

  3. jQuery选择器和事件

    选择器 常用事件 绑定与解除绑定 事件目标与冒泡 自定义事件

  4. 商人过河问题(DFS)

    问题描述:3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人.在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过 ...

  5. PHP安全性

    一.防sql注入 用户通过输入完整的字符,来和sql语句拼接成带有破坏性的sql语句,服务器执行该语句,造成破坏. 1使用mysql_real_escape_string()过滤数据,该方法在未来版本 ...

  6. 企业信息系统——CRM

    客户关系管理系统(Customer Relationship Management)将客户看作是企业的一项重要资产,客户关怀是CRM的中心,其目的是与客户建立长期和有效的业务关系,在与客户的每个“接触 ...

  7. 关于ClassLoader的一点小问题

    今天在看某框架的源码的时候,遇到一个使用URLClassLoader加载Servlet类的问题,当自己在eclipse里面做试验的时候,始终无法把Class加载成功.比如: ClassLoader c ...

  8. LeetCode----263. Ugly Number(Java)

    package isUgly263; /* * Write a program to check whether a given number is an ugly number. Ugly numb ...

  9. HDU 5686:2016"百度之星" - 资格赛 Problem B

    原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others)    ...

  10. 解读HTML 5新语法 提高语义价值

    HTML 5的新标记 设计者们需要完成的任务是要给HTML 5开发一个更丰富的和更有含义的语义,当然可以想象这种新方案将会是很灵活和很高效的,同时与所有的现代互联网标准相适应.下面就是一些将要在HTM ...