我正在尝试根据xaml中设置的枚举来更改标签的颜色。我无法更新颜色。任何帮助都会很棒。
谢谢!
<UserControl.Resources>
<!-- Normal -->
<SolidColorBrush x:Key="Normal_bg_Unselect" Color="#FF1A73CC" />
<SolidColorBrush x:Key="Normal_fg_Unselect" Color="#FF72BAFF" />
<SolidColorBrush x:Key="Normal_bg_Select" Color="#FF1ACCBF" />
<SolidColorBrush x:Key="Normal_fg_Select" Color="#FF91FFFF" />
</UserControl.Resources>
<Grid>
<Label Name="BackgroundLabel" Width="Auto" Height="Auto" BorderThickness="0" Panel.ZIndex="1" Cursor="Hand">
<Label.Foreground>
<SolidColorBrush Color="{DynamicResource Color_LightBlue}"/>
</Label.Foreground>
<Label.Style>
<Style TargetType="{x:Type Label}">
<Setter Property="Background" Value="{Binding BgUnselect}" />
<Setter Property="Foreground" Value="{Binding FgUnselect}" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{Binding BgSelect}" />
<Setter Property="Foreground" Value="{Binding FgSelect}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Background" Value="{Binding BgUnselect}" />
<Setter Property="Foreground" Value="{Binding FgUnselect}" />
</Trigger>
</Style.Triggers>
</Style>
</Label.Style>
<Label.OpacityMask>
<LinearGradientBrush>
<GradientStop Color="#00FFFFFF" Offset="-.35"/>
<GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Label.OpacityMask>
</Label>
<TextBlock Name="ContentLabel" Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, FallbackValue='Styled Button'}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0" FontFamily="/HarringtonGroup.TrainingBuilder;component/Fonts/#HelveticaNeue" FontSize="30" Foreground="{Binding ElementName=BackgroundLabel, Path=Foreground}" />
</Grid>
背后的代码
public SolidColorBrush BgUnselect { get; set; }
public SolidColorBrush FgUnselect { get; set; }
public SolidColorBrush BgSelect { get; set; }
public SolidColorBrush FgSelect { get; set; }
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
switch (ButtonType)
{
case ButtonType.Normal:
BgUnselect = (SolidColorBrush)FindResource("Normal_bg_Unselect");
FgUnselect = (SolidColorBrush)FindResource("Normal_fg_Unselect");
BgSelect = (SolidColorBrush)FindResource("Normal_bg_Select");
FgSelect = (SolidColorBrush)FindResource("Normal_fg_Select");
return;
case ButtonType.OK:
case ButtonType.Cancel:
return;
}
答案 0 :(得分:2)
您的绑定标记不完整,您必须定义RelativeSource或ElementName
将UserControl更改为如下
<UserControl x:Name="userControl"
并将绑定应用为,
Value="{Binding BgSelect, ElementName=userControl}"
默认情况下,绑定会将BgSelect查找为User Control的“DataContext”属性。
此外,由于UserControl是从DependencyObject派生的,除非你的属性BgSelect等是依赖属性,否则这将不起作用。
答案 1 :(得分:0)
在我看来,您要做的就是将Foreground和Background属性设置为您定义的资源。
您是否尝试将{Binding ...}
代码替换为{StaticResource ...}
?
例如,更改
<Setter Property="Background" Value="{Binding BgUnselect}" />
到
<Setter Property="Background" Value="{StaticResource Normal_bg_Unselect}" />
以下编辑(根据评论)
您可以设想使用样式来控制每种按钮类型的4种颜色。我创建了一个可以应用于代码的小型实例。如果不清楚,我会尝试重写您的代码示例。
创建基本样式:
<Style x:Key="LabelStyleBase" TargetType="{x:Type Label}">
<Setter Property="Foreground" Value="{DynamicResource ForegroundBrush}"/>
<Setter Property="Background" Value="{DynamicResource BackgroundBrush}"/>
<!-- more style settings -->
</Style>
然后创建您的变体:
<Style x:Key="LabelStyle1" BasedOn="{StaticResource LabelStyleBase}" TargetType="{x:Type Label}">
<Style.Resources>
<SolidColorBrush x:Key="ForegroundBrush" Color="Purple" />
<SolidColorBrush x:Key="BackgroundBrush" Color="Pink" />
</Style.Resources>
</Style>
<Style x:Key="LabelStyle2" BasedOn="{StaticResource LabelStyleBase}" TargetType="{x:Type Label}">
<Style.Resources>
<SolidColorBrush x:Key="ForegroundBrush" Color="Aqua" />
<SolidColorBrush x:Key="BackgroundBrush" Color="Yellow" />
</Style.Resources>
</Style>
您可能会收到一条警告,指出无法找到资源,但这应该没问题。
替代解决方案
最后,如果您不想使用此路线,则可能必须在类上实现INotifyPropertyChanged并在画笔属性上重写您的setter以触发NotifyPropertyChanged事件。
有点不清楚你是如何实现自定义Button控件的,但你可能应该将按钮类型枚举公开为DependencyProperty并更改DependencyProperty的更改通知上的颜色画笔。
希望有所帮助。