首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在列标题样式被间接使用时动态地切换另一列标题样式,在每一列中使用BasedOn继承

问如何在列标题样式被间接使用时动态地切换另一列标题样式,在每一列中使用BasedOn继承
EN

Stack Overflow用户
提问于 2019-09-01 19:45:48
回答 1查看 248关注 0票数 0

我有一台DataGrid。我希望设置它的样式,允许用户从一组主题(最初是Light和Dark)中选择一个主题。以我的知识,我只能为一个主题做到这一点。

我想过在Resources中使用DataGridColumnHeader样式,通过DynamicResource使用它,并在代码隐藏中更改它,但是在任何窗口出现之前,我得到了这个错误和两个类似的错误:

代码语言:javascript
复制
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

代码语言:javascript
复制
<Window x:Class="wpf_datagrid_themes_1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf_datagrid_themes_1"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="450">
    <Grid Margin="20">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <DataGrid x:Name="MyDataGrid">
            <DataGrid.Resources>
                <Style TargetType="DataGridColumnHeader" x:Key="DataGridColumnHeaderDarkStyle">
                    <Setter Property="Background" Value="Black"/>
                    <Setter Property="TextElement.Foreground" Value="White"/>
                    <Setter Property="HorizontalContentAlignment" Value="Center"/>
                    <Setter Property="BorderThickness" Value="1"/>
                    <Setter Property="BorderBrush" Value="Gray"/>
                </Style>
            </DataGrid.Resources>

            <DataGrid.Columns>
                <DataGridTextColumn Header="Column 1" Width="*">
                    <DataGridTextColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
                            <Setter Property="ToolTip" Value="ToolTip for column 1"/>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>
                </DataGridTextColumn>

                <DataGridTextColumn Header="Column 2" Width="*">
                    <DataGridTextColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
                            <Setter Property="ToolTip" Value="ToolTip for column 2"/>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>
                </DataGridTextColumn>

                <DataGridTextColumn Header="Column 3" Width="*">
                    <DataGridTextColumn.HeaderStyle>
                        <Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
                            <Setter Property="ToolTip" Value="ToolTip for column 3"/>
                        </Style>
                    </DataGridTextColumn.HeaderStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>

        <Button Grid.Row="1" Click="Button_Click" Margin="10">
            CHANGE
        </Button>
    </Grid>
</Window>

代码隐藏

代码语言:javascript
复制
using System.Windows;
using System.Windows.Controls.Primitives;

namespace wpf_datagrid_themes_1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // Ideally, this handler should:
            //
            // if ( the dark style is applied ) : apply the light style
            // else : apply the dark style

            MyDataGrid.Resources["DataGridColumnHeaderDarkStyle"] =
                new Style(typeof(DataGridColumnHeader));
        }
    }
}

使用StaticResource而不是DynamicResource时的屏幕截图

​

​

上面给出的代码和标记不能很好地工作,因为结合使用BasedOn和DynamicResource会抛出错误。我希望它可以工作,但我必须找到一个走走。

我使用的是WindowsFramework4.7.2和VS2019(撰写本文时的最新稳定版本)和Windows10(撰写本文时的最新稳定版本)。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-02 22:13:57

您应该将DynamicResource更改为StaticResource

代码语言:javascript
复制
BasedOn="{StaticResource DataGridColumnHeader}">

然后,...and使用DynamicResource设置属性

代码语言:javascript
复制
<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>

然后定义一个Dark.xaml资源字典,在其中将引用的Background和Foreground资源定义为黑色,并定义另一个Light.xaml资源字典,在其中将资源定义为浅色。然后,您可以在运行时在这两个资源字典之间切换。

这就是如何使用资源实现主题化,即您总是使用相同的Style,但此Style用于设置元素属性的资源在运行时可能会发生变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57745704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档