2010-07-15 5 views
0

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

Вот мой код:

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

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

Любые идеи, как это решить? Спасибо!

ответ

0

Я спросил, и я решил, что для решения проблемы мне нужно изменить события управления пользователя: Вместо 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(); 
    } 
Смежные вопросы