3

如果我在控件的资源部分或外部资源字典中定义了一些资源,如何使用另一个键定义相同的资源?我的意思是如何定义仅引用另一个已经存在的条目的资源条目?

更清楚地说,我希望有几个键引用一个资源,就像在编程语言中我可以为一个常量定义多个名称一样。可能吗?

我试过这样

<Window.Resources>
    <SolidColorBrush x:Key="Brush1" Color="#FFDF7B04"/>

    <RadialGradientBrush x:Key="Brush2" GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5">
        <GradientStop Color="#5060FF40" Offset="0" />
        <GradientStop Color="#5060FF40" Offset="0.1" />
        <GradientStop Color="#3560FF40" Offset="0.4" />
        <GradientStop Color="#0860FF40" Offset="0.8" />
        <GradientStop Color="#0060FF40" Offset="1" />
    </RadialGradientBrush>

    <Style x:Key="CustomStyle" TargetType="UserControl">
        <Style.Resources>
            <StaticResource x:Key="TheBrush" ResourceKey="Brush1"/>
        </Style.Resources>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="UserControl">
                    <Border x:Name="Border" BorderBrush="{StaticResource TheBrush}">
                        <!-- more content with several usings of {StaticResource TheBrush} -->
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

它甚至可以像我需要的那样在设计时工作。但甚至没有编译。

UPD。为了更清楚我真正想要的东西:在上面的示例中,我需要资源 TheBrush 的原因是,如果有时我决定将我的风格中的“TheBrush”外观替换为另一个画笔(比如 Brush2),我想在只有一个地方。我无法更改“Brush1”的定义,因为它可能已经在许多其他控件中使用(实际上它可以放在外部资源字典中并由另一个人维​​护)。

UPD 2.很抱歉,由于我的英语很差,我自己无法找到我的问题的答案,也无法正确地提出我的问题。感谢HB,现在我看到我想要的关键词是“别名”。我正在寻找一种别名资源的方法,并且有很多类似的问题:

ResourceDictionary 中的别名或引用

别名资源 (WPF)

重新定义/别名 WPF 中的资源?

等等

所以我的问题只是重复的,可以删除。

4

2 回答 2

4

您只需要DynamicResource为您使用“重命名”而不是StaticResource,但这可能并非在所有情况下都有效。

于 2016-06-24T10:48:11.773 回答
0

尝试这个:

<StackPanel Height="40" Orientation="Horizontal">
        <StackPanel.Resources>
            <Style x:Key="GenderButtonStyle" TargetType="{x:Type Button}">
                <Setter Property="MinWidth" Value="100" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border x:Name="InternalBorder"
                                    CornerRadius="5"
                                    Padding="5">
                                <TextBlock x:Name="InternalText"
                                           HorizontalAlignment="Center"
                                           VerticalAlignment="Center"
                                           Text="{TemplateBinding Content}" />
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="Tag" Value="Male">
                                    <Setter TargetName="InternalBorder" Property="Background" Value="RoyalBlue" />
                                    <Setter TargetName="InternalText" Property="Foreground" Value="White" />
                                </Trigger>
                                <Trigger Property="Tag" Value="Female">
                                    <Setter TargetName="InternalBorder" Property="Background" Value="White" />
                                    <Setter TargetName="InternalBorder" Property="BorderBrush" Value="RoyalBlue" />
                                    <Setter TargetName="InternalBorder" Property="BorderThickness" Value="1,1,1,1" />
                                    <Setter TargetName="InternalText" Property="Foreground" Value="RoyalBlue" />
                                </Trigger>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <!-- Whatever you want -->
                                </Trigger>
                                <Trigger Property="IsPressed" Value="True">
                                    <!-- Whatever you want -->
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </StackPanel.Resources>
        <Button x:Name="MaleButton"
                Content="Male"
                Style="{StaticResource GenderButtonStyle}"
                Tag="Male" />
        <Button x:Name="FemaleButton"
                Margin="5,0,0,0"
                Content="Female"
                Style="{StaticResource GenderButtonStyle}"
                Tag="Female" />
    </StackPanel>

我利用样式的共享功能同时影响两个按钮,而不是重复笨重的代码。然后在这些按钮的样式中,我控制了模板并编写了自己的模板,看起来与您所追求的相似。

如果您愿意,现在可以将这种样式存储在字典中。

于 2016-06-24T10:58:20.797 回答