2011-01-13 1 views
1


У меня есть список переключателей в wpf, и я хочу, чтобы пользователь мог переключать несколько кнопок, перетаскивая их. Для этого я использовал MouseEnter-Event для каждой кнопки. Это работает, когда я нажимаю кнопку мыши вне кнопок и начинаю перетаскивать. Но когда я нажимаю кнопку мыши на кнопке и начинаю перетаскивать, MouseEnter-Event запускается только для первой кнопки, где я нажимал кнопку мыши (также не запускаются никакие другие события, такие как наведение или mousemove).
Вот код:WPF: MouseEnter не работает на нескольких кнопках при нажатии мыши

public void AddButton() 
{ 
    ToggleButton btn = new ToggleButton(); 
    btn.MouseEnter += VisibilityButton_Enter; 
    this.gridButtons.Children.Add(btn); 
} 

private void VisibilityButton_Enter(object sender, MouseEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed || e.RightButton == MouseButtonState.Pressed) 
    { 
     ToggleButton btn = sender as ToggleButton; 
     btn.IsChecked = !btn.IsChecked; 
    } 
} 

Я нашел решение использовать «перетаскивания» и DragOver мероприятие, но я думаю, что должно быть простое решение?

ответ

1

Как отметил Кент, ToggleButton захватывает мышь. Если мы справимся с событием PreviewMouseDown, мы можем это предотвратить. Остальное просто отслеживает состояние мыши, поэтому мы не щелкаем дважды во время одного перелиста. Ниже приведено поведение, которое вы можете добавить к своей кнопке, чтобы включить щелчок.

Сначала добавьте это пространство имен:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

и соответствующая ссылка на ваш проект.

Тогда XAML выглядит следующим образом (обратите внимание на RollOverBehavior):

<Grid> 
    <ItemsControl> 
     <ItemsControl.ItemsSource> 
      <PointCollection> 
       <Point/> 
       <Point/> 
       <Point/> 
       <Point/> 
       <Point/> 
      </PointCollection> 
     </ItemsControl.ItemsSource> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ToggleButton Width="25" Height="25"> 
        <i:Interaction.Behaviors> 
         <local:RollOverBehavior/> 
        </i:Interaction.Behaviors> 
       </ToggleButton> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Grid> 

и вот само поведение:

public class RollOverBehavior : Behavior<ToggleButton> 
{ 
    bool mouseOver; 
    bool clicked; 

    protected override void OnAttached() 
    { 
     AssociatedObject.PreviewMouseLeftButtonDown += (s, e) => 
     { 
      AssociatedObject.IsChecked = !AssociatedObject.IsChecked; 
      e.Handled = true; 
     }; 
     AssociatedObject.MouseEnter += (s, e) => 
     { 
      mouseOver = true; 
      clicked = false; 
     }; 
     AssociatedObject.MouseLeave += (s, e) => 
     { 
      mouseOver = false; 
     }; 
     AssociatedObject.MouseMove += (s, e) => 
     { 
      if (mouseOver && !clicked && e.LeftButton == MouseButtonState.Pressed) 
      { 
       AssociatedObject.IsChecked = !AssociatedObject.IsChecked; 
       clicked = true; 
      } 
     }; 
    } 
} 
1

Проблема в том, что поведение по умолчанию для ToggleButton заключается в захвате мыши при нажатии левой кнопки мыши. Поскольку мышь захвачена, все события мыши отправляются на первый ToggleButton.

Звучит так, как будто вы хотите переопределить это поведение по умолчанию, так что мышь не захвачена, но, честно говоря, я не мог точно следовать именно тому, чего вы пытаетесь достичь.

 Смежные вопросы

  • Нет связанных вопросов^_^