2016-06-24 1 views
2

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

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

Я пытался таким образом

<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. Прошу прощения за то, что из-за моего бедного английского языка я не смог найти ответ на свой вопрос, а сам niether правильно поставил вопрос. Благодаря H.B. теперь я вижу, что ключевым словом того, что я хочу, является «псевдоним». Я ищу способ наложения спектров ресурсов, и есть много подобных вопросов:

Alias or Reference in ResourceDictionary

Aliasing Resources (WPF)

Redefine/alias a resource in WPF?

т.д.

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

+0

Вы хотите использовать один ресурс несколько раз, но ресурс не должен быть тем, что может использоваться несколькими экземплярами одновременно? – Jai

+0

@Jai: Нет. Я знаю про x: Общий атрибут. Это не так. – Sergey

ответ

3

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

+0

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

+0

Просто замените '' с '' и 'BorderBrush =" {StaticResource TheBrush} " 'с' BorderBrush = "{DynamicResource TheBrush}" '. –

+0

Я заменил, как вы и предложили, но все же я получаю System.Windows.Markup.XamlParseException в строке . В нем говорится, что нельзя использовать DynamicResourceExtension в коллекции ResourceDictionary. Не могли бы вы предоставить рабочее решение? – Sergey

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> 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^