WPF как вызвать событие мыши на двух элементах пользовательского интерфейса, наложенных друг на друга

#c# #wpf #event-handling #code-behind

#c# #wpf ( ВП ) #обработка событий #код за #wpf

Вопрос:

У меня есть два пользовательских элемента. Изображение внутри окна просмотра и Холст, который накладывает его. На обоих зарегистрировано событие MoseMove в коде позади. В настоящее время вызывается событие только для элемента, который находится сверху.

Есть ли какой-либо способ вызвать MouseMove в обоих UIElements?

XAML:

 <Window x:Class="WpfApp2.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:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid ClipToBounds="True">
        <Viewbox Name="border" StretchDirection="Both" Stretch="Uniform" Panel.ZIndex="0" >
            <Grid>
                <Image Name="image"  Panel.ZIndex="1"  >
                    <Image.Source>
                        <BitmapImage UriSource="d:test.png"/>
                    </Image.Source>
                </Image>
            </Grid>
        </Viewbox>
        <Canvas Name="canvas" Panel.ZIndex="2" Background="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
</Window>
  

Код за:

 using System.Windows;
using System.Windows.Input;

namespace WpfApp2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded  = MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            border.PreviewMouseMove  = Border_PreviewMouseMove;
            canvas.PreviewMouseMove  = Canvas_PreviewMouseMove;
        }

        private void Border_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            //Not Raised...
        }

        private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            //Raised...
        }

    }
}
  

Ответ №1:

Вы можете попробовать это 🙂

 private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e)
{
     border.RaiseEvent(e);
}