web-dev-qa-db-ja.com

コントロールのどこでもWPF MouseDownイベントが発生しない

私は現在、別のWPF闘争、すなわちmouseEventsと戦っています。私は基本的に非常にシンプルなコントロールを持っています(BorderにはGridが含まれ、それ自体にいくつかのTextBlocksがあります)。シンプルな動作を実現しようとしています。ダブルクリックすると、コントロールが編集モードに変わります(実際には、同じデータにバインドされているTextBlocksTextBoxesが非表示になります)。

何もおかしくないですよね?それでも、私は苦労しています。 MouseDoubleClickにリンクされているUserControlは、コントロールをクリックしたとき(たとえば、テキストブロックをクリックしたとき)に起動します。 TextBlocksの間の空白をクリックすると、何も起動されません。 MouseDownでもありません。

マウスのクリックをすべてキャッチできるようにするにはどうすればよいですか? MouseDownイベントをBorderにリンクすると、境界線上のすべてのクリックをキャッチできると思いましたが、境界線の空の部分でのクリックをキャッチできませんでした。

ここに私があなたがそれを実行するために作ったドラフトコードがあります:

XAML:

<StackPanel Orientation="Vertical">
    <Border Height="400" Width="400" HorizontalAlignment="Center" VerticalAlignment="Center" BorderBrush="Black" BorderThickness="2"
        MouseDown="Border_MouseDown" MouseUp="Border_mouseUp">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="*" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Text="BLUFF" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Text="BLUFF" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Text="BLUFF" Grid.Column="2" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>

    </Border>

    <TextBlock Height="100" Width="300" HorizontalAlignment="Center" TextAlignment="Center" x:Name="thetext" Visibility="Collapsed"
               Foreground="White" Background="Red" Text="CLICKED!" />
</StackPanel>

コードビハインド:

private void Border_MouseDown(object sender, MouseButtonEventArgs e)
    {
        thetext.Visibility = Visibility.Visible;
    }

    private void Border_mouseUp(object sender, MouseButtonEventArgs e)
    {
        thetext.Visibility = Visibility.Collapsed;
    }

次に、「BLUFF」テキストの1つをクリックしてみます。「CLICKED」テキストが表示されます。 TextBlock間の別の場所をクリックしてみてください。何も起こりません。

ありがとうございました!

24
Damascus
<StackPanel Background="Transparent" ...

または

<Border Background="Transparent" ...

トリックを行う必要があります...

これにより、グリッドは透明になりますが、マウスクリックでは表示されます。

詳細は こちら をご覧ください。

他にもいくつかの状況があり、PreviewXXX- Eventを使用する必要があります。これは、子要素がイベントを「飲み込む」ときですが、あなたの場合、上記は探していたものです。

36
HCL