我有一个自定义的WPF线,我想用鼠标选择时改变样式。
我尝试使用触发器(请参阅下面的代码),但这不起作用。
问题出在哪里? IsSelected
属性已更改,但StrokeThickness
根本不会更改...(
XAML:
<UserControl.Resources>
<Style TargetType="stops:MyLine"
x:Key="MyLineStyleKey" x:Name="MyLineStyleName">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
<Setter Property="StrokeThickness" Value="10" />
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Canvas...
...
<my:MyLine Style="{StaticResource MyLineStyleKey}" x:Name="myLine1"
Stroke="Black" X11="10" X22="100" Y11="10" Y22="100"/>
代码:
class MyLine : Shape
{
public static readonly DependencyProperty X11Property;
public static readonly DependencyProperty X22Property;
public static readonly DependencyProperty Y11Property;
public static readonly DependencyProperty Y22Property;
public static readonly DependencyProperty IsSelectedProperty;
static MyLine()
{
X11Property = DependencyProperty.Register("X11", typeof(double), typeof(MyLine), new FrameworkPropertyMetadata(double.NaN, FrameworkPropertyMetadataOptions.AffectsRender));
X22Property = DependencyProperty.Register("X22", typeof(double), typeof(MyLine), new FrameworkPropertyMetadata(double.NaN, FrameworkPropertyMetadataOptions.AffectsRender));
Y11Property = DependencyProperty.Register("Y11", typeof(double), typeof(MyLine), new FrameworkPropertyMetadata(double.NaN, FrameworkPropertyMetadataOptions.AffectsRender));
Y22Property = DependencyProperty.Register("Y22", typeof(double), typeof(MyLine), new FrameworkPropertyMetadata(double.NaN, FrameworkPropertyMetadataOptions.AffectsRender));
IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(MyLine), new FrameworkPropertyMetadata(false));
}
public MyLine()
: base()
{
this.PreviewMouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(DirectionLine_PreviewMouseLeftButtonDown);
}
void DirectionLine_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
this.IsSelected = !this.IsSelected;
}
[TypeConverter(typeof(LengthConverter))]
public double X11 { get { return (double)GetValue(X11Property); } set { SetValue(X11Property, value); } }
[TypeConverter(typeof(LengthConverter))]
public double X22 { get { return (double)GetValue(X22Property); } set { SetValue(X22Property, value); } }
[TypeConverter(typeof(LengthConverter))]
public double Y11 { get { return (double)GetValue(Y11Property); } set { SetValue(Y11Property, value); } }
[TypeConverter(typeof(LengthConverter))]
public double Y22 { get { return (double)GetValue(Y22Property); } set { SetValue(Y22Property, value); } }
[TypeConverter(typeof(BooleanConverter))]
public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty); } set { SetValue(IsSelectedProperty, value); } }
protected override System.Windows.Media.Geometry DefiningGeometry
{
get
{
var geometryGroup = new GeometryGroup();
geometryGroup.Children.Add(new LineGeometry(new Point(X11, Y11), new Point(X22, Y22)));
return geometryGroup;
}
}
}
答案 0 :(得分:2)
尝试使用“<Trigger Property="IsSelected" ...>
”而不是DataTrigger。 DataTrigger适用于FrameworkElement的DataContext。在您的情况下,这意味着它将查找控件的DataContext的IsSelected属性。另一方面,Trigger直接在FrameworkElement本身上工作,并查找FrameworkElement的依赖属性。
<UserControl x:Class="StackOverflow.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:StackOverflow">
<UserControl.Resources>
<Style TargetType="local:MyLine"
x:Key="MyLineStyleKey" x:Name="MyLineStyleName">
<Style.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter Property="StrokeThickness" Value="10" />
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Canvas>
<local:MyLine Style="{StaticResource MyLineStyleKey}" x:Name="myLine1"
Stroke="Black" X11="10" X22="100" Y11="10" Y22="100"/>
</Canvas>
</UserControl>