UserControl PreviewMouseLeftButtonUp проблема - PullRequest
0 голосов
/ 16 июля 2010

У меня есть пользовательский контроль в WPF.У меня также есть окно без полей.Для его перемещения я использую DragMove.Но чтобы получить событие щелчка в пользовательском элементе управления, я использую событие PreviewMouseLeftButtonUp и фиксирую мышь на UserControl_MouseEnter.Проблема в том, что если я щелкаю элемент управления, а затем перемещаю окно, событие может быть вызвано также при нажатии рядом с элементом управления, а не на нем.

Вот мой код:

UserControl1.xaml:

<UserControl x:Class="WpfApplication1.UserControl1"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       mc:Ignorable="d" 
       d:DesignHeight="300" d:DesignWidth="300" MouseEnter="UserControl_MouseEnter" MouseLeave="UserControl_MouseLeave">
  <Grid>

  </Grid>
</UserControl>

UserControl1.xaml.cs:

public partial class UserControl1 : UserControl
  {
    public UserControl1()
    {
      InitializeComponent();
    }

    private void UserControl_MouseEnter(object sender, MouseEventArgs e)
    {
      CaptureMouse();
    }

    private void UserControl_MouseLeave(object sender, MouseEventArgs e)
    {
      ReleaseMouseCapture();
    }


  }

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication1" WindowStyle="None" MouseLeftButtonDown="Window_MouseLeftButtonDown">
  <Grid>
    <my:UserControl1 Margin="39,29,380,199" Background="Red" PreviewMouseLeftButtonUp="UserControl1_PreviewMouseLeftButtonUp">

    </my:UserControl1>
  </Grid>
</Window>

MainWindow.xaml.cs:

public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }


    private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
      DragMove();
    }

    private void UserControl1_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
      MessageBox.Show("Hello World");
    }
  }

Если вы запустите это приложение - вы увидите, что если вы нажмете на элемент управления, затем перетащите окно, затем щелкните рядом с элементом управления (сторона может отличаться) - это вызоветСобытие PreviewMouseLeftButtonUp, даже если вы не нажали на сам элемент управления.

Есть идеи, как решить эту проблему?Спасибо!

1 Ответ

0 голосов
/ 18 июля 2010

Я поспрашивал и обнаружил, что для решения проблемы мне нужно изменить события пользовательского элемента управления: вместо MouseLeave - я использую MouseMove.

 private void UserControl_MouseEnter(object sender, MouseEventArgs e)
  {
   if (this.IsEnabled)
    CaptureMouse();
  }

  private void UserControl_MouseMove(object sender, MouseEventArgs e)
  {
       Point mouseposition = e.GetPosition(this);
       if (mouseposition.X < 0 || mouseposition.Y < 0 || mouseposition.X > this.ActualWidth || mouseposition.Y > this.ActualHeight)
        ReleaseMouseCapture();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...