Как получить доступ к dependencyProperty в пользовательском Canvas - PullRequest
0 голосов
/ 04 февраля 2019

Я создал пользовательский Canvas, который inhirat из Canvas, я объявил новое свойство зависимости "NewMouseOver", на которое я хочу воздействовать через Setter в Trigger.

public class CanvaNetwork : Canvas
{
public CanvaNetwork() { }



public bool NewMouseOver
{
get { return (bool)GetValue(NewMouseOverProperty); }
set { SetValue(NewMouseOverProperty, value); }
}

public static readonly DependencyProperty NewMouseOverProperty =
DependencyProperty.Register("NewMouseOver", typeof(bool), 
typeof(CanvaNetwork), new PropertyMetadata(false));


}

и вот мой XAML:

<DataTemplate DataType="{x:Type local:Node}">
    <local:CanvaNetwork x:Name="ItemCanvas_Node" 
                        NewMouseOver="{Binding MyMouseOver}" 
                        Background="Transparent">

        <Path x:Name="Path_NodeProcess"

                Stroke="Green"
                Fill="Gray"
                Stretch="None"
                Data="{Binding  Path =Geometryform}"
                Visibility="{Binding Path=Visibility}">
        </Path>
        <local:CanvaNetwork.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter  Property="NewMouseOver"  Value="True" />
            </Trigger>
        </local:CanvaNetwork.Triggers>
    </local:CanvaNetwork>
</DataTemplate>

Гера - это мой класс узлов:

Public Node :DependencyObject
{

 public static readonly DependencyProperty MyMouseOverProperty =
            DependencyProperty.Register("MyMouseOver", typeof(bool), typeof(NodeProcess), new PropertyMetadata(true,new PropertyChangedCallback(On_MyMouseOver)));

        private static void On_MyMouseOver(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            //..some code

        }

        public bool MyMouseOver
        {
            get { return (bool)GetValue(MyMouseOverProperty); }
            set { SetValue(MyMouseOverProperty, value); }
        }



}

что я хочу: 1-у меня есть DependencyProperty: NewMouseOver (получает и устанавливает не так, как IsMouseOver в исходном классе холста).2-доступ к NewMouseOver через Trigger / Setter и изменить состояние NewMouseOver.3-через XAML: установить привязку betwin: NewMouseOver (в CanvaNetwork) и MyMouseOver (в классе узлов). 4-й после этого я буду использовать On_MyMouseOver (в классе узлов) и MyMouseOver для создания некоторых вещей.

1 Ответ

0 голосов
/ 19 февраля 2019

Я думаю, что могу ответить на вопрос о том, как обновить свойство DependencyProperty в вашем объекте canvas.

Чтобы проверить его, я бы определил метод «при изменении» для свойства зависимости.Здесь можно установить точку останова, чтобы убедиться, что свойство зависимости установлено.

class CanvaNetwork : Canvas
{
  public CanvaNetwork ( ) { }

  public static readonly DependencyProperty NewMouseOverProperty
                           = DependencyProperty.Register ( "NewMouseOver",
                                                           typeof (bool),
                                                           typeof (CanvaNetwork),
                                                           new PropertyMetadata (false, OnNewMouseOverChanged)) ;

  public bool NewMouseOver
  {
    get { return (bool)GetValue (NewMouseOverProperty); }
    set { SetValue (NewMouseOverProperty, value); }
  }

  public static void OnNewMouseOverChanged ( DependencyObject d, DependencyPropertyChangedEventArgs e )
  {
  }
}

В шаблоне данных необходимо определить триггеры в стиле.

<DataTemplate DataType="{x:Type local:Node}">
  <local:CanvaNetwork x:Name="ItemCanvas_Node"
                Background="red" Height="100" Width="100">

    <Path x:Name="Path_NodeProcess"

        Stroke="Green"
        Fill="Gray"
        Stretch="None"
        Data="{Binding  Path =Geometryform}"
        Visibility="{Binding Path=Visibility}">
    </Path>

    <local:CanvaNetwork.Style>
      <Style>
        <Setter  Property="local:CanvaNetwork.NewMouseOver"  Value="False" />
        <Style.Triggers>
          <Trigger  Property="Canvas.IsMouseOver" Value="True">
            <Setter  Property="local:CanvaNetwork.NewMouseOver"  Value="True" />
          </Trigger>
        </Style.Triggers>
      </Style>
    </local:CanvaNetwork.Style>

  </local:CanvaNetwork>
</DataTemplate>

Вы можете толькообновите свойство с помощью триггера, если свойство по умолчанию установлено в стиле.

Чтобы это работало, я удалил ваш атрибут NewMouseOver = "{Binding MyMouseOver}" .Пункты 1 и 2 из вашего списка работают, но удаление этого атрибута означает, что пункт 3 не работает.

Тем не менее, я думаю, что вы, вероятно, в любом случае используете неправильный подход.Не лучше ли подключить событие MouseOver к свойству команды в классе Node, как описано здесь:

Как создать событие MouseOver в MVVM?

...