tags:

views:

17

answers:

1

Hi. I have a UserControl in WPF. I also have a Borderless window. To move it- I use DragMove. But- to get a click event in the user control- I use the PreviewMouseLeftButtonUp event and capture the mouse on UserControl_MouseEnter. The problem is- that if I click the control, then move the window- the event can be triggered also when clicking near the control, not on it.

Here is my code:

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");
    }
  }

If you run this app- you'll see that if you click on the control, then drag the window, then click near the control (the side may vary)- it will trigger the PreviewMouseLeftButtonUp event even though you didn't click on the control itself.

Any ideas how to solve this? Thanks!

A: 

I asked around, and found that to solve the problem, I need to change the User control's events: Instead of MouseLeave- I use 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();
  }
amitairos