Подтвердить что ты не робот

WPF: как использовать командные и входные привязки

Командные и входные привязки кажутся чрезвычайно сложными в WPF - привязка определенных команд к определенным входам не всегда работает. Как мне это сделать?

- Автоответчик -

Я обновил свой личный ответ своими собственными выводами, учитывая, как долго мне приходилось находить информацию, понимать и фактически реализовывать эти запутанные вещи.

Привязки в WPF кажутся недружественной концепцией, особенно если у вас нет опыта. Надеюсь, это облегчит жизнь людям.

4b9b3361

Ответ 1

Сначала добавьте пространство имен приложений в начало файла xaml, которое будет использовать привязку: ex.

xmlns:main="clr-namespace:MyApplication"

Затем добавьте собственный статический класс, содержащий команды вне класс главного окна: ex.

public static class Command
{
    public static RoutedCommand GSToggleCmd = new RoutedCommand();
    public static RoutedCommand ScreenZoomCmd = new RoutedCommand();
}

Мой класс главного окна оказался "MainWindow"; Я определил класс Command прямо под ним.

Наконец, добавьте привязки команд в файле xaml

<Window.CommandBindings>
    <CommandBinding Command="main:Command.GSToggleCmd" Executed="GameStateToggleExecuted" />
    <CommandBinding Command="main:Command.ScreenZoomCmd" Executed="ApplyScreenFitCmd" />
</Window.CommandBindings>

Command="" относится к RoutedCommand, к которому вы привязаны. Я назвал мою ссылку на пространство имен main, поэтому синтаксис main:Command.nameofcommand

Executed="" относится к функции, вызванной при запуске команды.

Пример функции Executed:

private void ApplyScreenFitCmd( object sender, ExecutedRoutedEventArgs args )
{
    string proportionStr = args.Parameter as string;
}

И что это. Минималистичный, простой подход к использованию CommandBindings в WPF.

Чтобы добавить команду, просто вставьте новый статический RoutedCommand в класс Command и добавьте CommandBinding в файл xaml под Window.CommandBindings

Примечание:

Редактор Visual Studio Xaml может сначала пожаловаться на то, что некоторая команда не может быть найдена. Построение проекта решит проблему.

Дополнительная информация:

Вы также можете запустить CommandBindings через InputBindings. (ключевые триггеры)

Пример (помещается в файл Xaml, который будет их использовать):

<Window.InputBindings>
    <KeyBinding Key="F5" Command="main:Command.GSToggleCmd" />
    <KeyBinding Modifiers="Shift+Alt" Key="Q" Command="main:Command.ScreenZoomCmd" CommandParameter="1.0" />
    <KeyBinding Modifiers="Alt" Key="W" Command="main:Command.ScreenZoomCmd" CommandParameter="0.75" />
    <KeyBinding Modifiers="Alt" Key="E" Command="main:Command.ScreenZoomCmd" CommandParameter="0.5" />
</Window.InputBindings>

Итак, в основном Key нажмите триггеры KeyBinding, который, в свою очередь, вызывает CommandBinding указанной команды, вызывая соответствующую функцию вызова.

Как и в приведенном выше примере, вы также можете определить CommandParameter, чтобы отправить параметр в вызываемую функцию. Самое приятное в этом состоит в том, что, как и выше, вы можете повторно использовать один и тот же CommandBinding, просто вставляя разные CommandParameters.

Вы также можете запустить CommandBindings через Кнопки, MenuItems и т.д.

Пример:

<MenuItem Header="100%" InputGestureText="Alt+Q" Command="main:Command.ScreenZoomCmd" CommandParameter="1.0"/>

Это тот же синтаксис, что и с InputBindings.

Мне потребовалось некоторое время, прежде чем я установил минималистский, единообразный способ использования привязок в WPF. Я надеюсь, что эта статья предотвратит всю борьбу, которую эта концепция, по-видимому, легко вызывает.

Ответ 2

Попробуйте

if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.Q)