管理用户可编辑的WPF样式
我有一些共享样式,它们定义了我的数据网格的外观,我将它们保存在style.xaml中 我添加了一个设置页面,可以让用户更改一些颜色。在该页面上,我有一个示例网格(由于共享资源样式,它自动看起来像其他网格)。在该页面上,用户可以使用颜色选择器修改属性的颜色,例如行背景颜色、高亮显示的行颜色、标题背景以及使用数据驱动转换器应用的其他样式 我希望样式仅应用于“设置”页面网格以进行预览,如果应用,则返回到“全局样式” 我一直在为每个可配置颜色加载颜色选择器,但不确定要将结果应用于什么 我应该: a。是否将所选颜色直接应用于网格?(网格似乎只允许动态分配样式,而不允许单独的样式设置器) b。获取共享资源,复制它,并在设置网格中交换它,而不是用户“应用”是否将其交换为共享资源?(在我看来,这是理想的,但不确定如何做到这一点。)管理用户可编辑的WPF样式,wpf,styling,Wpf,Styling,我有一些共享样式,它们定义了我的数据网格的外观,我将它们保存在style.xaml中 我添加了一个设置页面,可以让用户更改一些颜色。在该页面上,我有一个示例网格(由于共享资源样式,它自动看起来像其他网格)。在该页面上,用户可以使用颜色选择器修改属性的颜色,例如行背景颜色、高亮显示的行颜色、标题背景以及使用数据驱动转换器应用的其他样式 我希望样式仅应用于“设置”页面网格以进行预览,如果应用,则返回到“全局样式” 我一直在为每个可配置颜色加载颜色选择器,但不确定要将结果应用于什么 我应该: a。是否
c。还有别的办法吗 我倾向于这样处理:
<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>