为了使它能够在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兼容?
我已经尝试将应用程序转换为.NET Core(与GNU / Linux兼容),但是由于某些依赖关系而无法实现。
此方法System.Windows.Input
有时用于存在PresentationCore.dll
的方法中,因此我可以使用主KeyboardUtils.GetInputNumber
中的KeyPressEventArgs
将其重构为将KeyPressEventArgs
传播到此函数,并添加KeyPreview = true
([ C0])来拦截我的主键盘Form
上的所有键盘输入(由于@Giulio的回答)。
但是,大部分时间,例如,不带KeyPressEventHandler
的类/函数调用此函数(通过按数字键选择颜色):
void MainForm_KeyPress(object sender, KeyPressEventArgs e)
在那种情况下,重构将花费太多的精力。有没有比使用这些Form
方法将KeyPressEventArgs
传播到所有类中的所有函数更简单的解决方案?
您也应该能够在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