WPF 列表选择,动态调用ResourceDictionary内资源

来源:互联网 发布:源码查看 编辑:程序博客网 时间:2024/05/01 05:57
做WPF项目经常会碰到让客户从列表中选择样式,选定后,动态更改部件的样式。下面以动态更改一个控件的背景图为例子来说说实现的方法。
如果大家有更好的方法,欢迎在评论中提出来。


控件的背景图使用Microsoft Expression Design 4 设计的,使用Express Design的很大一个好处,就是不需要使用图片(减少软件的体积),而且
可以把设计的内容直接添加到ResourceDictionary里使用。在Express Design设计好的部件,按右键选择导出,格式选择:XAML Silverlight 4/WPF Canvas 即可。
导出后,去掉不必要的内容:各个Layer的名称等等,就可以放在资源文件内使用了。


本范例实现步骤如下:


1.新建一个WPF工程,添加一个ResourceDictionary文件,命名为:VisualStyles.xaml
   在里面添加从Express Design里设计好的内容:(这里以三个不同颜色的形状为例)
   <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <VisualBrush TileMode="None" x:Key="Style1">
        <VisualBrush.Visual>
            <Viewbox Width="1920" Height="1080">
                <Canvas Width="600.039" Height="599.879">
                    <Path Width="145.609" Height="144.765" Canvas.Left="-7.62939e-005" Canvas.Top="-4.57764e-005" Stretch="Fill" Fill="#FFFFC800" Data="F1 M -7.62939e-005,72.3784C -7.62939e-005,112.359 32.5887,144.765 72.8046,144.765L 72.8046,144.765C 113.012,144.765 145.609,112.359 145.609,72.3784L 145.609,72.3784C 145.609,32.3979 113.012,-4.57764e-005 72.8046,-4.57764e-005L 72.8046,-4.57764e-005C 32.5887,-4.57764e-005 -7.62939e-005,32.3979 -7.62939e-005,72.3784 Z "/>
                </Canvas>
            </Viewbox>
        </VisualBrush.Visual>
    </VisualBrush>
    <VisualBrush TileMode="None" x:Key="Style2">
        <VisualBrush.Visual>
            <Viewbox Width="1920" Height="1080">
                <Canvas Width="600.13" Height="599.878">
                    <Rectangle Width="122.776" Height="123.495" Canvas.Left="6.10352e-005" Canvas.Top="4.57764e-005" Stretch="Fill" Fill="#FF0096FF"/>
                </Canvas>
            </Viewbox>
        </VisualBrush.Visual>
    </VisualBrush>
    <VisualBrush TileMode="None" x:Key="Style3">
        <VisualBrush.Visual>
            <Viewbox Width="1920" Height="1080">
                <Canvas Width="600.13" Height="599.878">
                    <Rectangle Width="122.776" Height="123.495" Canvas.Left="6.10352e-005" Canvas.Top="4.57764e-005" Stretch="Fill" Fill="#FF009664"/>
                </Canvas>
            </Viewbox>
        </VisualBrush.Visual>
    </VisualBrush>
</ResourceDictionary>

注意最好放在Viewbox里,可以保证随窗体大小的变化而改变大小。


2.在App.xaml里引用这个资源文件
   <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles\VisualStyles.xaml"/>                
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

    </Application.Resources>


3. 将资源文件的内容绑定到一个ComboBox,供客户选择:
    首先定义一个要绑定的数据类型:
    public class WinStyles
    {
        public string StyleName { get; set; }//资源文件内的Key的名称
        public VisualBrush BackgroundBrush { get; set; }//把资源文件内的VisualBrush刷到控件上        
    }
   在主窗体XAML里添加一个ComboBox,代码如下:
    <ComboBox Grid.Row="1" x:Name="WinStyleList" Width="341" Height="114" ItemsSource="{Binding}" SelectionChanged="WinStyleList_SelectionChanged">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <Border CornerRadius="2,2,2,2" Margin="2" Background="{Binding BackgroundBrush}" Width="310" Height="100">
                        <TextBlock Text="{Binding StyleName}" Foreground="{Binding Fontcolor}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
   可以看到,资源的VisualBrush会作为Border的Background呈现。
   在窗体内实现以下代码:
   private void iniStyleList()
        {
            List<WinStyles> _winstyles = new List<WinStyles>();
            WinStyles st1 = new WinStyles();
            st1.StyleName = "Style1";
            st1.Fontcolor = new SolidColorBrush(Colors.White);
            st1.BackgroundBrush = (VisualBrush)this.FindResource("Style1");
            _winstyles.Add(st1);
            WinStyles st2 = new WinStyles();
            st2.StyleName = "Style2";
            st2.Fontcolor = new SolidColorBrush(Colors.White);
            st2.BackgroundBrush = (VisualBrush)this.FindResource("Style2");
            _winstyles.Add(st2);
            WinStyles st3 = new WinStyles();
            st3.StyleName = "Style3";
            st3.Fontcolor = new SolidColorBrush(Colors.Black);
            st3.BackgroundBrush = (VisualBrush)this.FindResource("Style3");
            _winstyles.Add(st3);
            //绑定到comboBox
            WinStyleList.ItemsSource = _winstyles;
            WinStyleList.SelectedIndex = 0;

        }


4. 当用户在ComboBox做出选择时,把资源的VisualBrush显示在主控件上。
      private void WinStyleList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            WinStyles winStyle = (WinStyles)this.WinStyleList.SelectedItem;
            this.DisplayStyle.Background = (VisualBrush)this.FindResource(winStyle.StyleName);
        }


这是在猪八戒网上请人(金蕾品牌设计)用Express Design设计的资源文件,在ComboBox上罗列出来效果很好。





本文源码下载:
http://download.csdn.net/detail/soft2buy/6713683

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 直播间有回音怎么办 XOX声卡有回音怎么办 电脑声卡有回音怎么办 戴尔笔记本没有声音怎么办 戴尔笔记本电脑没有声音怎么办 window10视频有回音怎么办 电脑麦克风有回音怎么办 win10话筒声音小怎么办 手机直播有回音怎么办 手机直播有回声怎么办 耳朵突然有回音怎么办 憋气耳膜不鼓怎么办 tt语音有回音怎么办? 无线话筒有回音怎么办 话筒发出刺耳声怎么办 刺激战场有回音怎么办 电脑音乐没有声音怎么办 额头小头发多怎么办 开瑜伽馆怎么办营业执照 急用100元钱怎么办 茶壶嘴底部漏水怎么办 茶壶嘴倒水回流怎么办 篮球气嘴漏气怎么办 网红气球漏气怎么办 哺乳期积乳囊肿怎么办 玩滑板怕摔怎么办 在农村结婚化妆怎么办 年检保单丢了怎么办 Excel排序不想要怎么办 科2考不过怎么办 红米手机变卡了怎么办 公司伙食有问题怎么办 拉小提琴不看谱怎么办 匡威白鞋子泛黄怎么办 婚礼主持突然打嗝怎么办 第一次上台演讲紧张怎么办 员工工作不积极怎么办 临时牌照怎么办进京证 第一次上台跳舞紧张怎么办 不倒翁沙袋吸盘不稳怎么办? 功夫贷逾期一天怎么办