双击行为

时间:2017-09-07 14:02:58

标签: c# avaloniaui

我试图实现双击行为。 .cs代码如下:

public class DoubleTappedBehavior : Behavior<InputElement>
{
    /// <summary>
    ///     The command.
    /// </summary>
    public static readonly DirectProperty<DoubleTappedBehavior, ICommand> CommandProperty = 
        AvaloniaProperty.RegisterDirect<DoubleTappedBehavior, ICommand>(
            nameof(Command), 
            o => o.Command,
            (o, v) => o.Command = v);

    public ICommand Command
    {
        get { return GetValue(CommandProperty); }
        set { SetValue(CommandProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.DoubleTapped += DoubleTapped;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.DoubleTapped -= DoubleTapped;
        base.OnDetaching();
    }

    private void DoubleTapped(object sender, RoutedEventArgs e)
    {
        if (Command == null)
            return;

        Command.Execute(null);
     }
}

xaml看起来像:

<TreeView Items="{Binding Sections, ElementName=ToC, Mode=TwoWay}" 
          SelectedItem="{Binding SelectedSection, ElementName=ToC, Mode=TwoWay}">

  <TreeView.Styles>
    <Style Selector="TreeViewItem">
      <Setter Property="commandBehaviors:DoubleTappedBehavior.Command"
              Value="{Binding IncrementCount}"/>
      <!--<Setter Property="commandBehaviors:DoubleTappedBehavior.CommandParameter"
              Value="{Binding}"/>-->
    </Style>
  </TreeView.Styles>
 </TreeView>

我得到了例外:无法找到AvaloniaProperty'DoubleTappedBehavior.Command'。可以这样设置吗?

1 个答案:

答案 0 :(得分:1)

无法告诉您正在使用的确切包,但看起来您正在创建类似Blend的行为,而样式正在尝试设置附加属性。

如果是这种情况,那么您需要更改行为类以使用附加属性或在样式中设置Interaction.Behaviors属性。

附属物:

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/attached-properties-overview

使用Blend SDK行为:

<TreeView Items="{Binding Sections, ElementName=ToC, Mode=TwoWay}" 
      SelectedItem="{Binding SelectedSection, ElementName=ToC, Mode=TwoWay}">
    <i:Interaction.Behaviors>
        <commandBehaviors:DoubleTappedBehavior Command="{Binding IncrementCount}" CommandParameter="{Binding}" />
    </i:Interaction.Behaviors>
</TreeView>

附加财产行为:

public class DoubleTappedBehavior
{
    public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(DoubleTappedBehavior), new PropertyMetadata(null, OnCommandChanged));
    public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.RegisterAttached("CommandParameter", typeof(object), typeof(DoubleTappedBehavior), new PropertyMetadata(null));

    private static void OnCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs args)
    {
        var element = target as UIElement;

        if (element != null)
        {
            element.DoubleTapped -= OnDoubleTapped;
            element.DoubleTapped += OnDoubleTapped;
        }
    }

    private static void OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
    {
        var element = sender as UIElement;

        if (element != null)
        {
            var command = GetCommand(element);
            var commandParameter = GetCommandParameter(element);

            if (command != null)
            {
                if (command.CanExecute(commandParameter))
                {
                    command.Execute(commandParameter);       
                }
            }
        }
    }

    public static void SetCommand(UIElement target, ICommand value) => target.SetValue(CommandProperty, value);

    public static ICommand GetCommand(UIElement target) => (ICommand)target.GetValue(CommandProperty);

    public static void SetCommandParameter(UIElement target, object value) => target.SetValue(CommandProperty, value);

    public static object GetCommandParameter(UIElement target) => target.GetValue(CommandParameterProperty);
}