Hit-Testing не работает в WPF Border с более низким Z-индексом

Как заставить проверку попадания работать для обоих элементов Border?#

В текущем коде событие фиксируется только для самой верхней границы, то есть Border2, поэтому, когда я щелкаю правой кнопкой мыши, я вижу окно сообщения, но когда я ничего не щелкаю левой кнопкой мыши! Можно ли это как-то исправить?

<Window x:Class="HiTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HiTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:Border1 Background="Transparent"/>
        <local:Border2 Background="Transparent"/>
    </Grid>
</Window>


public class Border1 : Border
{
    public Border1()
    {
        MouseLeftButtonDown += Border1_MouseLeftButtonDown;
    }

    private void Border1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("Left");
    }
}

public class Border2 : Border
{
    public Border2()
    {
        MouseRightButtonDown += Border2_MouseRightButtonDown;
    }

    private void Border2_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("Right");
    }
}

В общем, я хочу, чтобы он мог фиксировать разные события мыши с элементами управления родственными элементами, которые имеют разные Z-индексы.


person Vahid    schedule 13.08.2017    source источник


Ответы (1)


невозможно зафиксировать события для одноуровневых элементов. Всплывание работает только для элементов с родительским и дочерним отношением.

Что-то вроде этого с отношениями родитель-потомок.

<Grid Name="Parent">
    <Border Name="Border01" Background="Transparent" MouseDown="Border01_MouseDown">
        <Border Name="Border02" Background="Transparent" MouseDown="Border01_MouseDown" />
    </Border>
</Grid>

private void Border01_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (sender.GetType() == typeof(Grid)) { }

        if (sender.GetType() == typeof(Border))
        {
            if (((Border)sender).Name == "Border01" & e.LeftButton == MouseButtonState.Pressed)
            {
                MessageBox.Show("Left & Button01");
            }
            if (((Border)sender).Name == "Border02" & e.RightButton == MouseButtonState.Pressed)
            {
                MessageBox.Show("Right  & Button02");
            }
        }
    }

Если у вас есть родственные элементы, вам нужно делегировать MouseDown от верхнего элемента к нижнему элементу самостоятельно.

person Schnatti    schedule 13.08.2017