【发布时间】:2017-04-03 18:32:34
【问题描述】:
基本上我想要做的是将自定义窗口的状态从最大化状态更改为正常状态并调整窗口的位置,当用户单击并将鼠标移动到标题栏上时,标题栏在我的例子中是一个简单的边框。
显而易见的做法是将事件处理程序附加到MouseMove 并检查是否按下了鼠标左键:
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Console.WriteLine("Mouse moved" + Mouse.Captured);
}
}
问题是MouseMove 发生在鼠标捕获发生变化时。所以在我的应用程序中,当您打开一个弹出窗口并单击边框后,窗口将捕捉到Normal 状态,捕捉应该在您开始拖动后发生。
这是上面代码的 XAML 来证明问题:
<Grid MouseMove="OnMouseMove" Background="AliceBlue">
<ComboBox Height="23">
<ComboBoxItem>Test1</ComboBoxItem>
<ComboBoxItem>Test1</ComboBoxItem>
<ComboBoxItem>Test1</ComboBoxItem>
<ComboBoxItem>Test1</ComboBoxItem>
<ComboBoxItem>Test1</ComboBoxItem>
<ComboBoxItem>Test1</ComboBoxItem>
</ComboBox>
</Grid>
问题步骤,在debug中运行上述代码:
- 单击
ComboBox打开其弹出窗口。 - 单击蓝色网格(这将关闭弹出窗口)。
注意: 输出窗口显示消息“鼠标已移动”
预期行为:由于只进行了一次点击(没有鼠标移动),我不想要MouseMove 事件。
我知道Mouse.Captured 元素更改时会触发MouseMove,这是正常的,但我需要一种方法来区分正常的MouseMove 和由鼠标捕获引起的MouseMove。
编辑:
可以在 MahApps.Metro 演示中找到有关此问题的更复杂示例。步骤与上述相同 - 打开一个弹出窗口并在窗口处于最大化状态时单击标题栏。您会注意到窗口从最大化状态捕捉到正常状态。这不应该发生,因为您没有双击或拖动标题栏。
到目前为止我的解决方案:
因为我知道这是由鼠标捕获的元素变化引起的,所以我处理了LostMouseCapture 事件并保存了鼠标位置:
private Point mousePositionAfterCapture;
private void OnLostMouseCapture(object sender, MouseEventArgs e)
{
mousePositionAfterCapture = e.GetPosition(this);
}
在MouseMove 处理程序中,我检查上次丢失鼠标捕获后位置是否发生了变化:
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Point currentPossition = e.GetPosition(this);
if (currentPossition == mousePositionAfterCapture)
//means that the MouseMove event occurred as a result of
//Mouse Captured element change, we wait until an actual
//mouse move will occure
return;
Console.WriteLine("Mouse moved" + Mouse.Captured);
}
}
【问题讨论】:
-
上述 XAML 和 EventHandler 应该足以重现该问题。问题是,当您通过单击蓝色网格内的某处关闭
ComboBox的弹出窗口时,您将收到我不想要的 MouseMove 事件。 -
嗯,将 ComboBox ClickMode 更改为 Press 并告诉我们是否可以解决您的问题...
-
ComboBox没有ClickMode属性。 -
我很抱歉,这是在 ToggleButton 问题上发布的。按钮有点击模式。您是否尝试过使用 IsMouseDirectlyOver 属性?还有 IsMouseDirectlyOver 事件。
-
我刚刚找到了您关于Focus的上一个问题的解决方案,您已经被删除了:(。找到解决方案了吗?:)
标签: wpf