0

我有一个 Windows 窗体应用程序,它有一个 WPF 用户控件,可通过 ElementHost 控件使用。

WPF 用户控件具有旨在响应鼠标滚轮事件的代码。但是,当我运行应用程序并使用鼠标滚轮时,与这些事件相关联的代码都没有在 wpf 中运行。我通过在 Visual Basic 代码中放置断点来测试这一点。尽管如此,它确实会响应其他鼠标事件(例如单击或拖动,我用它来旋转我的 3d 模型)。

我想知道鼠标滚轮事件可能没有从 Windows 窗体传递到 WPF 用户控件,因为 Windows 窗体没有(或有限)鼠标滚轮支持。

相反,我尝试在 WPF 应用程序中编写一个 WPF 用户控件的简单程序该控件响应鼠标滚轮事件。

WPF 用户控件有一个 viewport3D,我用它来做一些 3d 绘图,而这在 Windows 窗体中是做不到的。

这个问题有解决方法吗?我希望你能帮忙。谢谢你。

这是我如何在 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>
4

2 回答 2

1

我们发现您必须将处理程序连接到 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();
    }
}
于 2016-08-12T21:17:55.677 回答
0

我设法解决了这个问题。我所要做的就是将控件设置为可聚焦并将焦点设置为控件

要将 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 事件中以编程方式设置焦点。

于 2013-11-11T17:56:42.497 回答