0

我的方法有一个小问题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();
    }

它不起作用。我不知道为什么。Menu 是 的后代UIElement,所以在我看来一切都还可以。

我相信这很简单,我在代码中有一个愚蠢的错误。

4

1 回答 1

2

Menu 本身使用 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>

在左侧,菜单消耗点击,在右侧,处理程序将被调用。

于 2013-08-19T17:31:23.013 回答