zoukankan      html  css  js  c++  java
  • 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 == 0) return;
    
                foreach (var img in images)
                {
                    Image imgTheme = new Image()
                    {
                        Width = 100,
                        Stretch = Stretch.Fill,
                        Height = 60,
                        Margin = new Thickness(2)
                    };
                    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[0] = new ResourceDictionary()
                    {
                        Source = new Uri(fileName, UriKind.RelativeOrAbsolute)
                    };
                }
                catch (Exception ex)
                {
                    return;
                }
            }
        }
    ResourceHelper.cs
  • 相关阅读:
    vue双向绑定的时候把遍历的数组转为了字符串,并且再转回去数组进行绑定
    使用for of循环遍历获取的nodeList,配置babel编译,webpack打包之后在iphone5下报错
    iview表单验证不生效问题注意点
    babel配置项目目录支持转换es6语法,引入非项目目录js后,引入Js转换无效
    swiper4自动轮播切换手动触碰后停止踩坑——属性disableOnInteraction
    移动网页广告引入mraid.js使用指南
    react项目和next项目修改默认端口号
    windows安装mongodb服务简洁版教程
    Fiddler抓包手机代理配置
    手机配置代理报错invalid host header
  • 原文地址:https://www.cnblogs.com/YunGy/p/4798095.html
Copyright © 2011-2022 走看看