События колесика мыши в элементе управления wpf, размещенном в формах Windows

У меня есть приложение Windows Forms, в котором есть один пользовательский элемент управления WPF, доступный через элемент управления ElementHost.

Пользовательский элемент управления WPF имеет код, предназначенный для реагирования на события колесика мыши. Однако ни один из написанного кода, связанного с этими событиями, не запускается в wpf, когда я запускаю приложение и использую колесико мыши. Я проверил это, разместив точки останова в коде Visual Basic. Несмотря на это, он реагирует на другие события мыши (например, щелчок или перетаскивание, которые я использую для вращения моей 3D-модели).

Мне было интересно, что, возможно, события колесика мыши не передаются из Windows Forms в пользовательский элемент управления WPF, потому что окна не поддерживают (или ограничивают) колесико мыши.

Напротив, я попытался написать простую программу пользовательского элемента управления WPF внутри приложения WPF, и этот элемент управления реагирует на события колеса мыши.

В пользовательском элементе управления WPF есть viewport3D, который я использую для трехмерного рисования, чего нельзя сделать в Windows Forms.

Есть ли способ решения этой проблемы? Я надеюсь, что вы можете помочь. Спасибо.

Вот пример того, как я настраиваю событие Mousewheel в элементе управления WPF. Я пробовал использовать UserControl, Grid и Canvas, но ни в одном из них не было событий колеса мыши.

<UserControl x:Class="LPViewport3D"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300" Background="white" MouseMove="UserControl_MouseMove" MouseDown="UserControl_MouseDown" MouseWheel="UserControl_MouseWheel">
<Grid MouseWheel="Grid_MouseWheel" Background="white">
    <Viewport3D x:Name="VP" Margin="0" ClipToBounds="False" Grid.Row="0" Grid.Column="0" >
<!-- more code -->

</Viewport3D>

    <!-- Ovelay canvas to receive mouse events-->
    <Canvas Grid.Row="0" Grid.Column="0" 
        Background="Transparent"
        MouseDown="Canvas_MouseDown"
        MouseMove="Canvas_MouseMove" MouseWheel="Canvas_MouseWheel" />
</Grid>

person Luis    schedule 07.11.2013    source источник
comment
вы пробовали предварительный просмотр?   -  person punker76    schedule 07.11.2013
comment
Я просто попробовал события PreviewMouseWheel, но ничего не помогло.   -  person Luis    schedule 07.11.2013


Ответы (2)


Мы обнаружили, что вам нужно подключить обработчик к событию ElementHost.HostContainer.MouseEnter и вернуть фокус обратно на карту. Мы узнали, как это сделать, из сообщения SO: https://stackoverflow.com/a/15464539/2250424

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        elementHost1.HostContainer.MouseEnter += HostContainer_MouseEnter;
    }

    private void HostContainer_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        mapControl1.bingMap.Focus();
    }
}
person Geobility    schedule 12.08.2016

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

Чтобы настроить пользовательский элемент управления WPF как настраиваемый, мне нужно было добавить запись в файл XAML.

<UserControl x:Class="LPViewport3D"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         Focusable="True">

а затем в приложении WinForms мне нужно было установить фокус на элемент управления. Чтобы убедиться, что элемент управления сфокусирован и отвечает, я также программно устанавливаю фокус в событии Usercontrol WPF MouseDown.

person Luis    schedule 11.11.2013
comment
это не работает для меня. Где именно в WinForm вы сосредоточили внимание на элементе управления WPF? - person dmg; 06.04.2016