serhio
serhio

Reputation: 28586

WPF Trigger not working (sample)

I have a custom WPF Line, that I whant to change the Style when selecting with mouse.

I tried to use triggers(see code bellow), but this does not work.

Where is the problem? The IsSelected property is changed, but the StrokeThickness does not change at all... (

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"/>

Code:

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;
        }
    }
}

Upvotes: 1

Views: 1289

Answers (1)

ASanch
ASanch

Reputation: 10373

Try using "<Trigger Property="IsSelected" ...>" instead of a DataTrigger. DataTrigger works on the DataContext for a FrameworkElement. In your case, this means that it will look for the IsSelected property of the control's DataContext. Trigger, on the other hand, works directly on the FrameworkElement itself, and looks for Dependency Properties of the 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>

Upvotes: 2

Related Questions