DragMove()
方法存在一个小问题。我想在处理菜单上的MouseLeftButtonDown
事件时调用它(简单地说,我想通过菜单拖动窗口)。
我的XAML:
<Window x:Class="LoginForm.RidicWindow"
...namespaces...
Title="RidicWindow" Height="600" Width="800" WindowStyle="None" ResizeMode="NoResize" BorderBrush="#48067f" BorderThickness="2" Icon="img/EvidenceLogo.png">
some XAML
<Menu x:Name="Menu" Grid.Column="0" Grid.Row="0" MouseLeftButtonDown="Drag">
...rest of doc
相应的C#代码:
private void Drag(object sender, MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
this.DragMove();
}
它不起作用。我不知道为什么。菜单是UIElement
的后代,所以在我看来,一切似乎都没问题。
我认为这很简单,我在代码中犯了一个愚蠢的错误。
答案 0 :(得分:1)
菜单本身会消耗MouseLeftButtonDown事件。因此,不会调用任何事件处理程序。只会引发PreviewMouseLeftButtonDown。但是在此事件中调用DragMove()会阻止正常的菜单功能。在DragMove()内部发送WM_LBUTTONUP消息,此方法返回后,似乎根本没有按下任何按钮。
解决方案可以是:将菜单放入具有两个列的网格中,一个自动,一个*(或省略宽度)。给网格一个背景,否则它不会接收鼠标事件
<Grid MouseLeftButtonDown="handler">
<Grid.Background>
<SolidColorBrush Color="{DynamicResource {x:Static SystemColors.MenuBarColorKey}}" />
</Grid.Background>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Menu IsMainMenu="True">...</Menu>
</Grid>
在左侧部分菜单消耗点击,在右侧部分将调用处理程序。