C# 如何在间接使用列标题样式时动态切换列标题样式,在每个列中使用BasedOn继承
我有一个数据网格。我希望对它进行风格设计,允许用户从一组主题中选择一个主题,最初是浅色和深色。就我所知,我只能为一个主题做这件事 我曾考虑在参考资料中使用DataGridColumnHeader样式,通过DynamicSource使用它,并在代码隐藏中更改它,但在出现任何窗口之前,我收到了这个错误,然后出现了两个类似的错误: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
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>