【发布时间】:2020-06-11 23:35:24
【问题描述】:
我有一个带有(异步)工具窗口的 Visual Studio 扩展。工具窗口有一个UserControl,控件有一个Image,我使用WriteableBitmap 作为源。基本上,我正在尝试在工具窗口上使用图形 API (Vulkan)。
基本上,我的扩展看起来类似于 Visual Studio 的 3d 模型编辑器。
我的问题是,当我单击工具窗口时,不会调用像 MouseLeftButtonDown 或 PreprocessMouseLeftButtonDown 这样的鼠标事件处理程序。我曾尝试向UserControl、Image 甚至HwndHost 添加鼠标事件处理程序,但没有成功。
我知道IMouseProcessor 或其他变体,但在我看来,它们用于文本编辑器,而不仅仅是工具窗口窗格或用户控件。
HwndHost 的WndProc 方法似乎也没有收到任何鼠标事件。简单地通过替换父 Hwnd 的 WndProc 来“取悦”它似乎可行,但我不想创建一个控制整个 Visual Studio 的扩展。
== 编辑 ==
public partial class MyControl : UserControl {
public MyControl () {
InitializeComponents ();
MouseLeftButtonDown += MyLeftButtonDown;
}
...
private void MyLeftButtonDown (object sender, MouseButtonEventArgs e) {
// This code never gets executed.
}
}
这些也不是。
<UserControl ...
IsHitTestVisible="True"
MouseLeftButtonDown="MyLeftButtonDown ">
<Image x:Name="View" ... />
<!--- nor this --->
<!--- <Image x:Name="View" MouseLeftButtonDown="MyLeftButtonDown " /> --->
</UserControl>
这也行不通。
public partial class MyControl : UserControl {
public MyControl () {
InitializeComponents ();
// View is an object of Image class.
View.MouseLeftButtonDown += MyLeftButtonDown;
}
...
private void MyLeftButtonDown (object sender, MouseButtonEventArgs e) {
// This code never gets executed.
}
}
// C++/CLI
IntPtr MyHost::WndProc (IntPtr hWndPtr, int uMsg, IntPtr wParamPtr, IntPtr lParamPtr, bool % handled)
{
auto hWnd = (HWND) hWndPtr.ToPointer ();
auto wParam = (WPARAM) wParamPtr.ToPointer ();
auto lParam = (LPARAM) lParamPtr.ToPointer ();
switch (uMsg)
{
case WM_LBUTTONDOWN: // This doesn't get called.
break;
...
default:
handled = false;
return IntPtr (DefWindowProc (hWnd, uMsg, wParam, lParam));
}
...
handled = true;
return IntPtr (0);
}
【问题讨论】:
-
能否请您share a Minimal, Reproducible Example 与我们联系,我们将提供任何其他详细信息。
标签: c# wpf visual-studio-2019 visual-studio-extensions vsix