2016-06-24 6 views
2

コントロールのリソースセクションまたは外部リソースディクショナリにいくつかのリソースが定義されている場合、同じリソースを別のキーでどのように定義できますか?つまり、既存の別のエントリを参照するだけのリソースエントリを定義するにはどうすればいいですか?別のキーで同じリソースを定義する方法は?

もっと明確にするには、プログラミング言語のように1つのリソースを参照する複数のキーが必要です。定数の名前をいくつか定義できます。 可能ですか?

私はそのよう

<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と言う)に置き換えることにしたとき、唯一の場所にあります。 Withalは、他の多くのコントロールですでに使用されている可能性があるため(Brush1の定義を変更することはできません(実際には外部リソース辞書に配置して他の人が管理することができます)。

UPD 2.私は貧しい私の英語のために、私は自分自身の質問に答えを見つけることができませんでした。 H.Bのおかげです。今私が欲しいもののキーワードは "エイリアス"であることがわかります。私は、エイリアシングリソースの方法を探しています、と多くの類似の質問があります:

Alias or Reference in ResourceDictionary

Aliasing Resources (WPF)

Redefine/alias a resource in WPF?

など

は、だから私の質問はただ重複しています削除される可能性があります。

+0

単一のリソースを複数回使用したいのですが、複数のインスタンスが同時に使用できるリソースではないはずです。 – Jai

+0

@Jai:いいえ、私はx:Shared属性について知っています。そうではありません。 – Sergey

答えて

3

StaticResourceの代わりにDynamicResourceを「名前を変更する」にしてください。これはすべてのコンテキストで機能しない場合があります。

+0

質問に記載されている動作を提供するために私の例を変更していただけますか?私が知っている限り、DynamicResourceは実行時リソースの置換に役立ちますが、私は静的リソースを便利に維持する方法を探しています。 – Sergey

+0

"およびBorderBrush =" {StaticResource TheBrush} "で' 'BorderBrush =" {DynamicResource TheBrush} "で' 'を指定します。 –

+0

私はあなたが提案したとおりに置き換えましたが、私はSystem.Windows.Markup.XamlParseExceptionをの行に入れています。 「ResourceDictionary」コレクションでDynamicResourceExtensionを使用することはできません。実用的なソリューションを提供してください。 – 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> 

私はむしろ不格好コードを繰り返すよりも、同時に2つのボタンに影響を与えるようにスタイルの共有機能を利用しました。 これらのボタンのスタイルの中で、私はテンプレートをコントロールし、自分のものをあなたの後ろに似て見えるように書きました。

このスタイルは、必要に応じて辞書に格納できるようになりました。

関連する問題