Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
管理用户可编辑的WPF样式_Wpf_Styling - Fatal编程技术网

管理用户可编辑的WPF样式

管理用户可编辑的WPF样式,wpf,styling,Wpf,Styling,我有一些共享样式,它们定义了我的数据网格的外观,我将它们保存在style.xaml中 我添加了一个设置页面,可以让用户更改一些颜色。在该页面上,我有一个示例网格(由于共享资源样式,它自动看起来像其他网格)。在该页面上,用户可以使用颜色选择器修改属性的颜色,例如行背景颜色、高亮显示的行颜色、标题背景以及使用数据驱动转换器应用的其他样式 我希望样式仅应用于“设置”页面网格以进行预览,如果应用,则返回到“全局样式” 我一直在为每个可配置颜色加载颜色选择器,但不确定要将结果应用于什么 我应该: a。是否

我有一些共享样式,它们定义了我的数据网格的外观,我将它们保存在style.xaml中

我添加了一个设置页面,可以让用户更改一些颜色。在该页面上,我有一个示例网格(由于共享资源样式,它自动看起来像其他网格)。在该页面上,用户可以使用颜色选择器修改属性的颜色,例如行背景颜色、高亮显示的行颜色、标题背景以及使用数据驱动转换器应用的其他样式

我希望样式仅应用于“设置”页面网格以进行预览,如果应用,则返回到“全局样式”

我一直在为每个可配置颜色加载颜色选择器,但不确定要将结果应用于什么

我应该:

a。是否将所选颜色直接应用于网格?(网格似乎只允许动态分配样式,而不允许单独的样式设置器)

b。获取共享资源,复制它,并在设置网格中交换它,而不是用户“应用”是否将其交换为共享资源?(在我看来,这是理想的,但不确定如何做到这一点。)


c。还有别的办法吗

我倾向于这样处理:

  • 使每个网格颜色成为单独的资源,然后使用DynamicSource从网格样式中引用它们
  • 将它们放在Styles.xaml(在ResourceDictionary.MergedDictionaries下)中单独的“颜色”资源字典中
  • 定义一个ColorProxy对象,该对象具有颜色属性,设置该属性后,将更新ResourceDictionary中笔刷的颜色
  • 在“设置”页面的构造函数中,克隆“颜色”资源字典并为每种颜色构造一个ColorProxy,然后绑定它们
  • 在设置页面的“保存”按钮中,将“颜色”资源字典复制到您的用户设置存储中,也复制到主“颜色”资源字典中
  • 大部分内容都很简单,所以我不会详细介绍

    下面是Styles.xaml的想法:

    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary>
          <SolidColorBrush x:Key="Row Background Color" Color="..." />
          ...
        </ResourceDictionary>
      </ResourceDictionary.MergedDictionaries>
    
      <Style TargetType="DataGrid">
         ...
         <Setter Property="Background" Value="{DynamicResource Row Background Color}" />
         ...
      </Style>
    </ResourceDictionary>
    
    现在可以使用以下工具编辑ResourceDictionary中的颜色:

    <ItemsControl ItemsSource="{Binding ColorProxies}">
      <ItemsControl.ItemTemplate>
        <DataTemplate DataType="local:ColorProxy">
          <DockPanel>
            <TextBlock Text="{Binding Key}" Width="200" />
            <ColorPicker Color="{Binding Color}" />
          </DockPanel>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
    
    
    
    编辑后的ResourceDictionary可以使用XamlWriter转换为存储字符串,并使用XamlReader重新加载

    通过对旧字典调用.Remove(),对新字典调用.Add(),可以修改Styles.xaml生成的主ResourceDictionary中的MergedDictionaries集合

    只需构造一个新的ResourceDictionary,迭代旧字典中的条目并将其添加到新字典中,即可克隆ResourceDictionary

    这种技术不需要局限于编辑颜色。可以创建任何类型的代理对象,包括由绑定中的转换器处理数据转换的通用代理对象

    public class ColorProxy
    {
      public ResourceDictionary Dictionary { get; set; }
      public object Key { get; set; }
      public Color Value
      {
        get { return ((SolidColorBrush)Dictionary[Key]).Color; }
        set { Dictionary[Key] = new SolidColorBrush { Color = value }; }
      }
    }
    
    <ItemsControl ItemsSource="{Binding ColorProxies}">
      <ItemsControl.ItemTemplate>
        <DataTemplate DataType="local:ColorProxy">
          <DockPanel>
            <TextBlock Text="{Binding Key}" Width="200" />
            <ColorPicker Color="{Binding Color}" />
          </DockPanel>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>