我已经创建了一个按钮控制模板,我想根据按钮的模式(无论是Go模式还是Stop模式)更改按钮的颜色。 XAML看起来像:
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Ellipse x:Name="innerCircle" RenderTransformOrigin=".5,.5">
<Ellipse.RenderTransform>
<ScaleTransform ScaleX=".8" ScaleY=".8"/>
</Ellipse.RenderTransform>
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStopCollection>
<GradientStop Offset="0" Color="Green"/>
<GradientStop Offset="1" Color="Transparent"/>
</GradientStopCollection>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Viewbox>
<ContentPresenter Margin="{TemplateBinding Padding}"/>
</Viewbox>
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsGo}" Value="True">
<Setter TargetName="outerCircle" Property="Fill">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStopCollection >
<GradientStop Offset="0" Color="White"/>
<GradientStop Offset="1" Color="Red"/>
</GradientStopCollection>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter TargetName="innerCircle" Property="Fill">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStopCollection>
<GradientStop Offset="0" Color="Red"/>
<GradientStop Offset="1" Color="Transparent"/>
</GradientStopCollection>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Grid.Resources>
<Button Background="Transparent" Content="STOP" Padding="10" Template="{StaticResource buttonTemplate}" Height="84" Width="87" Click="Button_Click"></Button>
</Grid>
在我的DataTrigger中,我有一个IsGo DP属性的绑定,我在后面的代码中定义了(类型为boolean)。我有一个单击处理程序,可以在后面的代码中切换此DP的状态:
/// <summary>
/// Interaction logic for GoButton.xaml
/// </summary>
public partial class GoButton
{
public GoButton()
{
InitializeComponent();
}
public static readonly DependencyProperty IsGOProperty = DependencyProperty.Register("IsGo", typeof(Boolean), typeof(GoButton), new PropertyMetadata(false));
public Boolean IsGo
{
get { return (Boolean)GetValue(IsGOProperty); }
set { SetValue(IsGOProperty, value); }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
IsGo = !IsGo;
}
}
但是,当我单击我的按钮时,没有任何反应 - 虽然点击处理程序代码执行并切换DP属性,但按钮的颜色保持绿色并且不会变为红色。我有什么想法吗?
感谢
答案 0 :(得分:1)
您需要触发依赖项属性进行刷新。你可以通过实现INotifyPropertyChanged
,删除IsGOProperty然后像这样实现IsGo来实现这一点:
private bool _isgo = false;
public bool IsGo {
get
{
return _isgo;
}
set
{
_isgo = value;
PropertyChanged(new PropertyChangedEventArgs("IsGo");
}
}
答案 1 :(得分:0)
你的TemplatedParent
是(我猜)你正在模板化的按钮。你最有可能定义你的属性的代码隐藏不是从按钮派生的控件,所以我猜你的触发器的绑定是不正确的......
如果您可以发布剩余的XAML和/或确认您的财产所在的代码,则可以确认。
编辑:您的评论确认了我的理论:您绑定到TemplatedParent
但该属性不在TemplatedParent
上,而是在您的用户控件上。最简单的解决方案是在x:Name="root"
的根元素中添加UserControl
标记,然后将触发器的绑定更改为{Binding ElementName=root, Path=IsGo}
。