将WPF System.Windows.Input.Keyboard类(来自PresentationCore.dll)替换为可与Mono一起使用

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

为了使它能够在GNU / Linux平台上使用,我正在C#应用程序上使其与[Mono兼容”。该应用程序使用WinForms和Windows Presentation Foundation API(PresentationCore.dll程序集)。 Mono and WinForms seems to work。但是,WPF APIs are not supported by Mono。例如,下面的代码示例:

using System.Windows.Input;

namespace MyNamespace.Utils
{
    public static class KeyboardUtils
    {
        public static int? GetInputNumber()
        {
            if (Keyboard.IsKeyDown(Key.D1)) return 1;
            // ... test other keys
            return null;
        }
    }
}

不编译:

error CS0103: The name 'Keyboard' does not exist in the current context

Key(在Key中可用,在System.Windows.Input组件中没有问题,因为WindowsBase.dll与Mono一起存在。

相反,WindowsBase.dll无法使用,因为即使它位于同一命名空间Keyboard中,它也位于Keyboard程序集中,并且在Mono中不可用,因为Mono不支持WPF。

如何转换这种代码以使其与Mono兼容?

编辑(1)

我已经尝试将应用程序转换为.NET Core(与GNU / Linux兼容),但是由于某些依赖关系而无法实现。

编辑(2)

此方法System.Windows.Input有时用于存在PresentationCore.dll的方法中,因此我可以使用主KeyboardUtils.GetInputNumber中的KeyPressEventArgs将其重构为将KeyPressEventArgs传播到此函数,并添加KeyPreview = true([ C0])来拦截我的主键盘Form上的所有键盘输入(由于@Giulio的回答)。

但是,大部分时间,例如,不带KeyPressEventHandler的类/函数调用此函数(通过按数字键选择颜色):

void MainForm_KeyPress(object sender, KeyPressEventArgs e)

在那种情况下,重构将花费太多的精力。有没有比使用这些Form方法将KeyPressEventArgs传播到所有类中的所有函数更简单的解决方案?

c# .net linux wpf mono
1个回答
0
投票

您也应该能够在WinForms设计器中为Mono添加键盘处理程序:

using System.Drawing;

namespace MyNamespace.Utils
{
    public static class ColorUtilities
    {
        public static Color? GetColorForHighlight()
        {
            int? inputNumber = KeyboardUtilities.GetInputNumber();
            switch (inputNumber)
            {
                case 1:
                    return Color.Red;
                // other cases
                default:
                    return null;
            }
        }
    }
}

然后您可以移植代码,就像在KeyPressEventArgs中所做的一样:

KeyboardUtils

替代

[如果您真的不想使用this.buttonPeriod.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.keyBoardInput); 进行重构,也许还可以看看calculator sample的替代方法:SDL似乎在Mono上具有/* * keyBoardInput - Handles user's input via keyboard. */ private void keyBoardInput(object sender, KeyPressEventArgs e) { if (e.KeyChar >= '0' && e.KeyChar <= '9') { enterNumber(e.KeyChar.ToString()); } else if (e.KeyChar == '.') { enterNumber(e.KeyChar.ToString()); } else if (e.KeyChar == '\b') { enterNumber("Backspace"); } else if (e.KeyChar == '=' || e.KeyChar == '+' || e.KeyChar == '-') { enterOperation(e.KeyChar.ToString()); } else if (e.KeyChar == '/') { enterOperation("÷"); } else if (e.KeyChar == '*') { enterOperation("×"); } }

KeyPressEventHandler

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