我正在开发 Autodesk Inventor 插件,并选择使用 Avalonia 作为 UI。
Inventor 提供了创建可停靠窗口的功能。我不完全确定它在幕后如何工作,但您可以通过将控件的句柄作为子项添加到可停靠窗口来向其添加 winforms / WPF 控件。
查看一些示例后,我弄清楚了如何将 avalonia 控件添加到可停靠窗口。
一切似乎都工作正常,只是不接受按键。 (只需退格并删除)当我通过功能区中的按钮运行应用程序时,不存在此类问题。
我在 StackOverflow 和 Autodesk 论坛上找到了一些信息。我认为问题可能与 Avalonia 有关,因此我使用此处的 sample 将 avalonia 应用程序嵌入到 WPF 窗口中,认为这可以解决问题。
没有。 autodesk 论坛上的这个thread描述了相同的问题,但针对的是 WPF 窗口。
<Grid>
<!--WPF input works-->
<TextBox Text="Text"></TextBox>
<!--Avalonia input does not work-->
<interop:WpfAvaloniaHost x:Name="AvaloniaHost" />
</Grid>
autodesk 线程中的修复:
public void Activate(ApplicationAddInSite addInSiteObject, bool firstTime)
{
// Setup my WPF Window.
var wpfWindow = new WpfWindow();
wpfWindow.WindowStyle = System.Windows.WindowStyle.None;
wpfWindow.ResizeMode = System.Windows.ResizeMode.NoResize;
wpfWindow.Visibility = System.Windows.Visibility.Visible;
// Get WPF Window's handle.
var helper = new WindowInteropHelper(wpfWindow);
helper.EnsureHandle();
var handle = helper.Handle;
// Create Dockable Window.
var dockableWindow = InventorApplication.UserInterfaceManager.DockableWindows.Add(System.Guid.NewGuid().ToString(), "Test", "Test");
dockableWindow.AddChild(handle);
// Set key hook.
HwndSource.FromHwnd(handle).AddHook(WndProc);
}
private const UInt32 DLGC_WANTARROWS = 0x0001;
private const UInt32 DLGC_WANTTAB = 0x0002;
private const UInt32 DLGC_WANTALLKEYS = 0x0004;
private const UInt32 DLGC_HASSETSEL = 0x0008;
private const UInt32 DLGC_WANTCHARS = 0x0080;
private const UInt32 WM_GETDLGCODE = 0x0087;
private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_GETDLGCODE)
{
handled = true;
return new IntPtr(DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_HASSETSEL | DLGC_WANTTAB | DLGC_WANTALLKEYS);
}
return IntPtr.Zero;
}
修复了 WPF 文本框中的输入问题,但尚未修复嵌入式 avalonia 窗口。
这让我得出结论:问题出在其他地方。
我需要以某种方式将按键传递给 avalonia 控件,但我不知道如何做。有人有解决这个问题的经验吗?非常感谢任何建议!
https://github.com/AvaloniaUI/Avalonia/discussions/13731
在 avalonia Github 讨论中回答,感谢 MrJul