Как определить тот же ресурс с другим ключом?

Если у меня есть некоторый ресурс, определенный в разделе ресурсов элемента управления или в словаре внешних ресурсов, как я могу определить тот же ресурс с другим ключом? Я имею в виду, как я могу определить запись ресурса, которая является просто ссылкой на другую уже существующую запись?

Чтобы быть более понятным, я хочу иметь несколько ключей, ссылающихся на один ресурс, так же как в языке программирования я могу определить несколько имен для одной константы. Является ли это возможным?

Я пробовал таким образом

<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

Aliasing Resources (WPF)

Переопределить / псевдоним ресурс в WPF?

и т.п.

Так что мой вопрос просто дубликат и может быть удален.

2 ответа

Вы просто должны использовать DynamicResource для вас "переименование" вместо StaticResource, что может не работать во всех контекстах, хотя.

Попробуй это:

<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>

Я использовал возможности совместного использования стилей, чтобы воздействовать на две кнопки одновременно, а не повторять неуклюжий код. Затем, в стиле этих кнопок, я взял под свой контроль шаблон и написал свой собственный, чтобы он выглядел примерно так, как вам нужно.

Этот стиль теперь может быть размещен в словаре, если хотите.

Другие вопросы по тегам