Я работаю над приложением C#, чтобы сделать его " Mono -совместимым", чтобы иметь возможность использовать его на платформах GNU / Linux. Это приложение использует WinForms и Windows API Presentation Foundation (PresentationCore.dll
сборка среди других). Mono и WinForms, кажется, работают . Но API WPF не поддерживаются 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
(доступно в System.Windows.Input
, из WindowsBase.dll
сборка), поскольку WindowsBase.dll
присутствует с Mono.
Напротив, Keyboard
не может использоваться, потому что, даже если он расположен в том же пространстве имен System.Windows.Input
, он находится в сборке PresentationCore.dll
, и он не доступен в Mono, поскольку Mono не поддерживает WPF.
Как преобразовать код такого типа, чтобы сделать его Mono-совместимым?
Edit (1)
Я пытался преобразовать приложение для. NET Core (совместимо с GNU / Linux), но это невозможно из-за некоторых зависимостей.
Edit (2)
Этот метод KeyboardUtils.GetInputNumber
иногда используется в методах, где присутствует KeyPressEventArgs
, поэтому я мог бы изменить его, чтобы распространить KeyPressEventArgs
на эту функцию, используя KeyPreview = true
в моем основном Form
и добавьте KeyPressEventHandler
(void MainForm_KeyPress(object sender, KeyPressEventArgs e)
) для перехвата всех вводов с клавиатуры на моем главном Form
(благодаря ответу @ Giulio). * 104 5 *
Но большую часть времени эта функция вызывается, например, классами / функциями без KeyPressEventArgs
(выбор цвета нажатием цифровой клавиши):
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
методы?