Autodesk Inventor 中嵌入的 Avalonia 窗口(文本框)不接受输入

问题描述 投票:0回答:1

我正在开发 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 控件,但我不知道如何做。有人有解决这个问题的经验吗?非常感谢任何建议!

c# interop avaloniaui avalonia
1个回答
0
投票

https://github.com/AvaloniaUI/Avalonia/discussions/13731

在 avalonia Github 讨论中回答,感谢 MrJul

© www.soinside.com 2019 - 2024. All rights reserved.