如果我在控件的资源部分或外部资源字典中定义了一些资源,如何使用另一个密钥定义相同的资源?我的意思是如何定义仅引用另一个已存在的条目的资源条目?
为了更清楚,我希望有几个键引用一个资源,就像在编程语言中一样,我可以为一个常量定义几个名称。 有可能吗?
我试过那种方式
<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
Redefine/alias a resource in WPF?
等
所以我的问题只是重复,可以删除。
答案 0 :(得分:4)
您只需使用DynamicResource
为您“重命名”而不是StaticResource
,但这可能不适用于所有情境。
答案 1 :(得分: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>
我利用样式的共享功能同时影响两个按钮,而不是重复笨重的代码。 然后在这些按钮的样式中,我已经控制了模板并编写了自己的模板,看起来与你所追求的类似。
如果需要,此样式现在可以放在字典中。