2016-07-11 4 views
2

Я попытался с поведением, не повезлоWPF обрабатывать двойное событие щелчка на большой палец и поднять его как новое событие на другом элементе управления

Поведение:

public sealed class BubbleDoubleClickEvent : Behavior<UIElement> 
    { 
     #region TargetElement 
     public UIElement TargetElement 
     { 
     get { return (UIElement)GetValue(TargetElementProperty); } 
     set { SetValue(TargetElementProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for TargetElement. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TargetElementProperty = 
     DependencyProperty.Register("TargetElement", typeof(UIElement), typeof(BubbleDoubleClickEvent)); 
    #endregion 

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

    private void AssociatedObject_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if(e.ClickCount == 2) 
     { 
      e.Handled = true; 
      var e2 = new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, e.ChangedButton); 
      e2.RoutedEvent = Control.PreviewMouseDoubleClickEvent; 

      var target = TargetElement ?? AssociatedObject; 
      target.RaiseEvent(e2); 
     } 
    } 

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

XAML:

<Grid> 
    <ContentPresenter x:Name="contentPresenter" Content="{Binding}" ContentTemplate="{Binding ..., Path=ItemTemplate }" /> 

    <Thumb x:Name="moveThumb" > 
     <i:Interaction.Behaviors> 
      <behaviors:BubbleDoubleClickEvent TargetElement="{Binding ElementName=contentPresenter}"/> 
     </i:Interaction.Behaviors> 
    </Thumb> 
</Grid> 

Любой помощь оценивается

+0

первую очередь, это даже запустить 'AssociatedObject_PreviewMouseDown' EventHandler? –

+0

@ MarkusHütter Да, это так! – sam

ответ

1

Код выше работает хорошо, но целевой контроль не получил накануне нт OnPreviewMouseDoubleClick так я должен был добавить обработчик экземпляра для управления событие так:

this.AddHandler(Control.PreviewMouseDoubleClickEvent, 
    new MouseButtonEventHandler((target, args) => 
    { 
     //do stuff 
     args.Handled = true; 
    }), false);