C# 如何在间接使用列标题样式时动态切换列标题样式,在每个列中使用BasedOn继承

C# 如何在间接使用列标题样式时动态切换列标题样式,在每个列中使用BasedOn继承,c#,wpf,xaml,datagrid,wpf-style,C#,Wpf,Xaml,Datagrid,Wpf Style,我有一个数据网格。我希望对它进行风格设计,允许用户从一组主题中选择一个主题,最初是浅色和深色。就我所知,我只能为一个主题做这件事 我曾考虑在参考资料中使用DataGridColumnHeader样式,通过DynamicSource使用它,并在代码隐藏中更改它,但在出现任何窗口之前,我收到了这个错误,然后出现了两个类似的错误: System.Windows.Markup.XamlParseException HResult=0x80131501 Message=A 'DynamicReso

我有一个数据网格。我希望对它进行风格设计,允许用户从一组主题中选择一个主题,最初是浅色和深色。就我所知,我只能为一个主题做这件事

我曾考虑在参考资料中使用DataGridColumnHeader样式,通过DynamicSource使用它,并在代码隐藏中更改它,但在出现任何窗口之前,我收到了这个错误,然后出现了两个类似的错误:

System.Windows.Markup.XamlParseException
  HResult=0x80131501
  Message=A 'DynamicResourceExtension' cannot be set on the 'BasedOn' property of type 'Style'. A 'DynamicResourceExtension' can only be set on a DependencyProperty of a DependencyObject.
  Source=PresentationFramework
  StackTrace:
   at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
   at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
   at wpf_datagrid_themes_1.MainWindow.InitializeComponent() in G:\Lucru\teste\wpf-datagrid-themes-1\wpf-datagrid-themes-1\MainWindow.xaml:line 1
我还尝试在DataGrid.ColumnHeaderStyle中移动此样式,但无法从中继承

XAML 改变 代码隐藏 使用System.Windows; 使用System.Windows.Controls.Primitives; 命名空间wpf_datagrid_themes_1 { /// ///MainWindow.xaml的交互逻辑 /// 公共部分类主窗口:窗口 { 公共主窗口 { 初始化组件; } 私有无效按钮\u单击对象发送者、路由目标 { //理想情况下,此处理程序应: // //如果应用了深色样式:应用浅色样式 //其他:应用深色样式 参考资料[DataGridColumnHeaderDarkStyle]= 新样式的DataGridColumnHeader类型; } } } 使用StaticResource而不是DynamicResource时的屏幕截图 上面介绍的代码和标记无法正常工作,因为将BasedOn与DynamicSource一起使用会引发错误。我原以为它会起作用,但我得找个地方走走

在撰写本文时,我使用.NET Framework 4.7.2和VS 2019最新稳定版本,在撰写本文时使用Windows 10最新稳定版本

谢谢。

您应该将DynamicSource更改为StaticResource:

…然后使用DynamicSource设置属性:

然后定义一个Dark.xaml资源字典,其中将引用的背景和前景资源定义为暗,并定义另一个Light.xaml资源字典,其中将资源定义为亮。然后,您可以在运行时在这两个资源字典之间切换


这就是使用资源实现主题化的方式,即始终使用相同的样式,但此样式用于设置元素属性的资源在运行时可能会更改。

我明天将尝试此方法。非常感谢。
BasedOn="{StaticResource DataGridColumnHeader}">
<Style TargetType="DataGridColumnHeader" x:Key="DataGridColumnHeaderDarkStyle">
    <Setter Property="Background" Value="{DynamicResource Background}"/>
    <Setter Property="TextElement.Foreground" Value="{DynamicResource Foreground}"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush" Value="Gray"/>
</Style>