将颜色附加为 DynamicResource 时,WPF TabControl 样式崩溃

发布于 2025-01-16 03:02:26 字数 7094 浏览 4 评论 0原文

我正在尝试将类似天蓝色的样式应用于我的 WPF TabControl,如 这里

我想实现这种外观和感觉:

在此处输入图像描述

<UserControl.Resources>
  <ResourceDictionary>

    <SolidColorBrush x:Key="AccentColorBrush" Color="CornflowerBlue" />
    <SolidColorBrush x:Key="BlackColor" Color="Black" />
    <SolidColorBrush x:Key="WhiteColor" Color="White" />
    <SolidColorBrush x:Key="Gray5" Color="LightGray" />

    <Style x:Key="AzureTabItem" TargetType="{x:Type TabItem}">
        <Setter Property="BorderBrush" Value="{DynamicResource AccentColorBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TabItem">
                    <StackPanel>
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}"
                                        Padding="12,2,24,2" 
                                        BorderThickness="0,0,0,4" 
                                        Margin="2,2,2,0"
                                        SnapsToDevicePixels="True">
                            <Border.Style>
                                <Style TargetType="Border">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <SolidColorBrush Color="{DynamicResource Gray5}"/>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </Border.Style>
                            <Label x:Name="root" FontSize="15">
                                <Label.Style>
                                    <Style TargetType="Label">
                                        <Setter Property="Foreground">
                                            <Setter.Value>
                                                <SolidColorBrush Color="{DynamicResource BlackColor}" />
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </Label.Style>
                                <ContentPresenter ContentSource="Header" RecognizesAccessKey="True" />
                            </Label>
                        </Border>
                        <Canvas Height="10" Width="20" x:Name="arrow" Margin="25,0,0,0"
                                        HorizontalAlignment="Left" SnapsToDevicePixels="True">
                            <Path Data="M 0 0 H 20 L 10 10 Z"
                                          StrokeThickness="0"
                                          Fill="{DynamicResource AccentColorBrush}"/>
                        </Canvas>
                    </StackPanel>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="root" Property="Foreground">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource WhiteColor}" />
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="border" Property="Background">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource AccentColor}"/>
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="border" Property="BorderBrush">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource AccentColor}"/>
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="arrow" Property="Visibility" Value="Visible"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="false">
                            <Setter  TargetName="root" Property="Foreground">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource BlackColor}" />
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="arrow" Property="Visibility" Value="Hidden"/>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="root" Property="Foreground">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource WhiteColor}" />
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="border" Property="BorderBrush" Value="{DynamicResource AccentColorBrush}"></Setter>
                            <Setter TargetName="border" Property="Background">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource AccentColor}"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

   </ResourceDictionary>
</UserControl.Resources>

我遇到的问题是,当我通过 DynamicResource 引用 SolidColorBrush 资源(AccentColorBrush、BlackColor、WhiteColor 和 Gray5)时,它们不起作用。 如果我直接在它们正在工作的样式中应用颜色。

使用 DynamicResource 会导致设计时出现异常并且 xaml 视图崩溃,例如,对于 Gray5 资源来说:

InvalidOperationException:“#FFD3D3D3”不是有效值 属性“颜色”。

然后我将此样式应用到我的 TabControl:

    <TabControl Grid.Row="1"
                Grid.RowSpan="5"
                Grid.Column="0"
                Grid.ColumnSpan="5">
        <TabControl.Resources>
            <Style TargetType="TabItem" BasedOn="{StaticResource AzureTabItem}"/>
        </TabControl.Resources>
        <TabItem Header="Home">
            <!-- cotent here -->
        </TabItem>
        <!-- some other TabItems here -->
    </TabControl>

I am trying to apply a azure-like style to my WPF TabControl as explained here.

I want to achieve this look and feel:

enter image description here

<UserControl.Resources>
  <ResourceDictionary>

    <SolidColorBrush x:Key="AccentColorBrush" Color="CornflowerBlue" />
    <SolidColorBrush x:Key="BlackColor" Color="Black" />
    <SolidColorBrush x:Key="WhiteColor" Color="White" />
    <SolidColorBrush x:Key="Gray5" Color="LightGray" />

    <Style x:Key="AzureTabItem" TargetType="{x:Type TabItem}">
        <Setter Property="BorderBrush" Value="{DynamicResource AccentColorBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TabItem">
                    <StackPanel>
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}"
                                        Padding="12,2,24,2" 
                                        BorderThickness="0,0,0,4" 
                                        Margin="2,2,2,0"
                                        SnapsToDevicePixels="True">
                            <Border.Style>
                                <Style TargetType="Border">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <SolidColorBrush Color="{DynamicResource Gray5}"/>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </Border.Style>
                            <Label x:Name="root" FontSize="15">
                                <Label.Style>
                                    <Style TargetType="Label">
                                        <Setter Property="Foreground">
                                            <Setter.Value>
                                                <SolidColorBrush Color="{DynamicResource BlackColor}" />
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </Label.Style>
                                <ContentPresenter ContentSource="Header" RecognizesAccessKey="True" />
                            </Label>
                        </Border>
                        <Canvas Height="10" Width="20" x:Name="arrow" Margin="25,0,0,0"
                                        HorizontalAlignment="Left" SnapsToDevicePixels="True">
                            <Path Data="M 0 0 H 20 L 10 10 Z"
                                          StrokeThickness="0"
                                          Fill="{DynamicResource AccentColorBrush}"/>
                        </Canvas>
                    </StackPanel>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="root" Property="Foreground">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource WhiteColor}" />
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="border" Property="Background">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource AccentColor}"/>
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="border" Property="BorderBrush">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource AccentColor}"/>
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="arrow" Property="Visibility" Value="Visible"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="false">
                            <Setter  TargetName="root" Property="Foreground">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource BlackColor}" />
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="arrow" Property="Visibility" Value="Hidden"/>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="root" Property="Foreground">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource WhiteColor}" />
                                </Setter.Value>
                            </Setter>
                            <Setter TargetName="border" Property="BorderBrush" Value="{DynamicResource AccentColorBrush}"></Setter>
                            <Setter TargetName="border" Property="Background">
                                <Setter.Value>
                                    <SolidColorBrush Color="{DynamicResource AccentColor}"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

   </ResourceDictionary>
</UserControl.Resources>

The problem I have is that SolidColorBrush resources (AccentColorBrush, BlackColor, WhiteColor and Gray5) are not working when I am referring them through a DynamicResource.
If I apply the colors directly within the style they are working.

Using DynamicResource cause an exception in design time and xaml view crashes, for example, for Gray5 resource is saying:

InvalidOperationException: '#FFD3D3D3' is not a valid value for
property 'Color'.

Then I apply this style to my TabControl:

    <TabControl Grid.Row="1"
                Grid.RowSpan="5"
                Grid.Column="0"
                Grid.ColumnSpan="5">
        <TabControl.Resources>
            <Style TargetType="TabItem" BasedOn="{StaticResource AzureTabItem}"/>
        </TabControl.Resources>
        <TabItem Header="Home">
            <!-- cotent here -->
        </TabItem>
        <!-- some other TabItems here -->
    </TabControl>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉城 2025-01-23 03:02:26

直接使用 Brush 资源:

<Setter Property="Background" Value="{DynamicResource Gray5}">

...而不是像这样创建另一个画笔:

<Setter Property="Background">
    <Setter.Value>
        <SolidColorBrush Color="{DynamicResource Gray5}"/>
    </Setter.Value>
</Setter>

如果您使用后一种方法,您应该将资源定义为 Color

<Color x:Key="Gray5">LightGray</Color>

Use the Brush resource(s) directly:

<Setter Property="Background" Value="{DynamicResource Gray5}">

...instead of creating another brush like this:

<Setter Property="Background">
    <Setter.Value>
        <SolidColorBrush Color="{DynamicResource Gray5}"/>
    </Setter.Value>
</Setter>

If you use the latter approach, you should define you resource as a Color:

<Color x:Key="Gray5">LightGray</Color>
欢你一世 2025-01-23 03:02:26

您将资源定义为 SolidColorBrush,但您尝试将它们用作 Color

<SolidColorBrush Color="{DynamicResource Gray5}"/>

SolidColorBrush.Color 采用 ColorGray5 是一个 SolidColorBrush

You are defining your resources as SolidColorBrush, but you are trying to use them as Color.

<SolidColorBrush Color="{DynamicResource Gray5}"/>

SolidColorBrush.Color takes a Color. Gray5 is a SolidColorBrush

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文