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

メニュー自体は、MouseLeftButtonDown イベントを消費します。したがって、イベント ハンドラは呼び出されません。PreviewMouseLeftButtonDown のみが発生します。ただし、このイベントで DragMove() を呼び出すと、通常のメニュー機能が妨げられます。DragMove() 内で WM_LBUTTONUP メッセージが送信されます。このメソッドが返された後、ボタンがまったく押されていないように見えます。

解決策は次のとおりです。 メニューを 2 つの列、1 つの Auto、1 つの * を持つグリッドに配置します (または幅を省略します)。グリッドに背景を与えます。そうしないと、マウス イベントを受け取りません

<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 に答える