WPF:换肤
看了一篇博客,觉得样式很好看,就自己动手做了一下,做个总结。
效果:
选择不同的图片背景就会改变:
直接上代码:
每个Theme对应一张图,除了图的名称不同之外,Theme?.xaml中的内容相同:
- <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
- <ImageBrush x:Key="WindowBack" ImageSource="../Images/Theme1.jpg" Stretch="UniformToFill"/>
- </ResourceDictionary>
Theme1.xaml
窗口的背景为动态资源,且有一个默认值在App.xaml中(<ResourceDictionary Source="Themes/Theme3.xaml"/>):
- <Window x:Class="ChangeTheme.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="MainWindow" Height="800" Width="800" WindowStyle="None" WindowState="Maximized"
- Background="{DynamicResource WindowBack}">
- <Window.Resources>
- <ResourceDictionary>
- <Style x:Key="ScrollViewerStyle1" TargetType="{x:Type ScrollViewer}">
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="{x:Type ScrollViewer}">
- <Grid>
- <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"
- Fill="White" Stretch="Fill" Stroke="SeaGreen" StrokeThickness="0.5">
- <!--B27A7A7A-->
- <Path.Effect>
- <DropShadowEffect Opacity="0.7" ShadowDepth="2" Direction="310"/>
- </Path.Effect>
- </Path>
- <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
- </Grid>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- </Style>
- </ResourceDictionary>
- </Window.Resources>
- <Grid Height="320" Width="400" HorizontalAlignment="Right" VerticalAlignment="Top">
- <ScrollViewer Width="350" Style="{DynamicResource ScrollViewerStyle1}" >
- <WrapPanel Margin="15,50" x:Name="ImagePanel">
- </WrapPanel>
- </ScrollViewer>
- </Grid>
- </Window>
MainWindow.xaml
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- LoadBackgroundImages();
- }
- private void LoadBackgroundImages()
- {
- string path = @"../../Images";
- var images =Directory.GetFiles(System.IO.Path.Combine(path)) ;
- if (images.Length == ) return;
- foreach (var img in images)
- {
- Image imgTheme = new Image()
- {
- Width = ,
- Stretch = Stretch.Fill,
- Height = ,
- Margin = new Thickness()
- };
- imgTheme.Name = System.IO.Path.GetFileNameWithoutExtension(img);
- imgTheme.Tag = img;
- imgTheme.Source = new BitmapImage(new Uri(img, UriKind.Relative));
- imgTheme.MouseLeftButtonDown += new MouseButtonEventHandler(imgTheme_MouseLeftButtonDown);
- ImagePanel.Children.Add(imgTheme);
- }
- }
- private void imgTheme_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- Image image = sender as Image;
- if (image != null && image.Source != null)
- {
- string imgName = image.Name;
- ResourceHelper.LoadResource("pack://application:,,,/ChangeTheme;component/Themes/" + imgName + ".xaml");
- }
- }
- }
MainWindow.cs
- static class ResourceHelper
- {
- public static void LoadResource(string fileName)
- {
- try
- {
- Application.Current.Resources.MergedDictionaries[] = new ResourceDictionary()
- {
- Source = new Uri(fileName, UriKind.RelativeOrAbsolute)
- };
- }
- catch (Exception ex)
- {
- return;
- }
- }
- }
ResourceHelper.cs
WPF:换肤的更多相关文章
- WPF换肤之八:创建3D浏览效果
原文:WPF换肤之八:创建3D浏览效果 上节中,我们展示了WPF中的异步以及界面线程交互的方式,使得应用程序的显示更加的流畅.这节我们主要讲解如何设计一个具有3D浏览效果的天气信息浏览器. 效果显示 ...
- WPF换肤之六:酷炫的时区浏览小精灵
原文:WPF换肤之六:酷炫的时区浏览小精灵 由于工作需要,经常要查看到不同地区的 当前时间,以前总是对照着时区表来进行加减运算,现在有了这个小工具以后,感觉省心了不少.下面是软件的截图: 效果图赏析 ...
- WPF换肤之七:异步
原文:WPF换肤之七:异步 在WinForm时代,相信大家都遇到过这种情形,如果在程序设计过程中遇到了耗时的操作,不使用异步会导致程序假死.当然,在WPF中,这种情况也是存在的,所以我们就需要寻找一种 ...
- WPF换肤之四:界面设计和代码设计分离
原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...
- WPF换肤之五:创建漂亮的窗体
原文:WPF换肤之五:创建漂亮的窗体 换肤效果 经过了前面四章的讲解,我们终于知道了如何拖拉窗体使之改变大小,也知道了如何处理鼠标事件,同时,也知道了如何利用更好的编写方式来编写一个方便实用和维护的换 ...
- WPF换肤之三:WPF中的WndProc
原文:WPF换肤之三:WPF中的WndProc 在上篇文章中,我有提到过WndProc中可以处理所有经过窗体的事件,但是没有具体的来说怎么可以处理的. 其实,在WPF中,要想利用WndProc来处理所 ...
- WPF换肤之二:可拉动的窗体
原文:WPF换肤之二:可拉动的窗体 让我们接着上一章: WPF换肤之一:创建圆角窗体 来继续. 在这一章,我主要是实现对圆角窗体的拖动,改变大小功能. 拖动自绘窗体的步骤 首先,通过上节的设计,我们知 ...
- WPF换肤之一:创建圆角窗体
原文:WPF换肤之一:创建圆角窗体 我们都期望自己的软件能够有一套看上去很吸引人眼球的外衣,使得别人看上去既专业又有美感.这个系列就带领着大家一步一步的讲解如何设计出一套自己的WPF的窗体皮肤,如果文 ...
- 有点激动,WPF换肤搞定了!
一如既往没废话! wpf桌面应用开发都是window内引入很多个UserControl. 如果你有通过不同颜色来换肤的需求,那么下面我就将整个过程! 分2个步骤: 1.主窗体背景色替换: 2.同时界面 ...
随机推荐
- jquery怎么跳出当前的each循环
有些朋友可能会以为在jquery跳出循环可以直接使用continue和break了,但是使用之后没有效果,因为在jquery中没有这两条命令. 后来上网查了下,得到了结果: return false; ...
- TCP状态变迁图
服务端,端口的状态变化 先在本机(IP地址为:192.168.1.10)配置FTP服务,然后在其它计算机(IP地址为:192.168.1.1)访问FTP服务,从TCPView看看端口的状态变化. 下面 ...
- jQuery选择器和事件
选择器 常用事件 绑定与解除绑定 事件目标与冒泡 自定义事件
- 商人过河问题(DFS)
问题描述:3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人.在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过 ...
- PHP安全性
一.防sql注入 用户通过输入完整的字符,来和sql语句拼接成带有破坏性的sql语句,服务器执行该语句,造成破坏. 1使用mysql_real_escape_string()过滤数据,该方法在未来版本 ...
- 企业信息系统——CRM
客户关系管理系统(Customer Relationship Management)将客户看作是企业的一项重要资产,客户关怀是CRM的中心,其目的是与客户建立长期和有效的业务关系,在与客户的每个“接触 ...
- 关于ClassLoader的一点小问题
今天在看某框架的源码的时候,遇到一个使用URLClassLoader加载Servlet类的问题,当自己在eclipse里面做试验的时候,始终无法把Class加载成功.比如: ClassLoader c ...
- LeetCode----263. Ugly Number(Java)
package isUgly263; /* * Write a program to check whether a given number is an ugly number. Ugly numb ...
- HDU 5686:2016"百度之星" - 资格赛 Problem B
原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others) ...
- 解读HTML 5新语法 提高语义价值
HTML 5的新标记 设计者们需要完成的任务是要给HTML 5开发一个更丰富的和更有含义的语义,当然可以想象这种新方案将会是很灵活和很高效的,同时与所有的现代互联网标准相适应.下面就是一些将要在HTM ...