6 Stimmen

Multitastengesten in WPF

Ich habe eine RoutedUICommand llamado Comment Selection . Ich muss eine Eingabegeste für diesen Befehl hinzufügen, wie sie in VIsual Studio vorhanden ist, d. h. ( Ctrl+K , Ctrl+C ). Wie kann ich das tun? Bitte helfen Sie mir. (VS-Funktionalität im Auge behalten).

Mit freundlichen Grüßen, Jawahar

5voto

SergeyGrudskiy Punkte 721

Dieser Code ist für die Kombinationen "Strg+W, Strg+E" und/oder "Strg+W, E" gedacht, kann aber für jede beliebige Tastenkombination parametrisiert werden:

XAML:

<MenuItem Header="Header" InputGestureText="Ctrl+W, E" Command="ShowCommand"/>

C#:

public static readonly RoutedUICommand ShowCommand = new RoutedUICommand(
    "Show command text", 
    "Show command desc", 
    typeof(ThisWindow), 
    new InputGestureCollection(new[] { new ShowCommandGesture (Key.E) }));

public class ShowCommandGesture : InputGesture
{
    private readonly Key _key;
    private bool _gotFirstGesture;
    private readonly InputGesture _ctrlWGesture = new KeyGesture(Key.W, ModifierKeys.Control);

    public ShowCommandGesture(Key key)
    {
        _key = key;
    }

    public override bool Matches(object obj, InputEventArgs inputEventArgs)
    {
        KeyEventArgs keyArgs = inputEventArgs as KeyEventArgs;
        if (keyArgs == null || keyArgs.IsRepeat)
            return false;

        if (_gotFirstGesture)
        {
            _gotFirstGesture = false;

            if (keyArgs.Key == _key)
            {
                inputEventArgs.Handled = true;
            }

            return keyArgs.Key == _key;
        }
        else
        {
            _gotFirstGesture = _ctrlWGesture.Matches(null, inputEventArgs);
            if (_gotFirstGesture)
            {
                inputEventArgs.Handled = true;
            }

            return false;
        }
    }
}

4voto

Oskar Punkte 7515

Ich habe diesen Blog-Beitrag gefunden, der mir weiterhelfen könnte

http://kent-boogaart.com/blog/multikeygesture

Grundsätzlich hat WPF keine eingebaute Unterstützung für es, aber Subclassing InputGesture oder KeyGesture scheint wie ein möglicher Weg, dies ohne zu viel Aufwand zu erreichen.

1voto

Major Malfunction Punkte 103

So habe ich etwas zusammengeschustert, das tatsächlich funktioniert. Ich wünschte nur, ich könnte die Person oder die Personen nennen, die mir den Weg zu meiner Arbeit geebnet haben. Pfad der Erleuchtung .

Nehmen wir an, Ihre Anwendung heißt Heckler . Fügen Sie ein Namespace-Tag für Ihre Anwendung in die Window Objekt:

<Window ...
    xmlns:w="clr-namespace:Heckler" 
    ...>

Fügen Sie nun eine CommandBindings und starten Sie Ihre Sammlung von CommandBinding Objekte. Hier fügen wir einen benutzerdefinierten Befehl hinzu Kommentar Auswahl :

<Window.CommandBindings>
    <CommandBinding
        Command="w:CustomCommands.CommentSelection"
        CanExecute="CommentSelectionCanExecute"
        Executed="CommentSelectionExecuted" />
</Window.CommandBindings>

Hinzufügen einer MenuItem zu einer Haupt Menu 's MenuItem :

    <Menu
        IsMainMenu="True">
        <MenuItem
            Header="_File">
            <MenuItem
                Command="w:CustomCommands.CommentSelection">
            </MenuItem>
        </MenuItem>
    </Menu>
    ...
</Window>

In der Window Code-Behind, fügen Sie Ihre CustomCommands Klasse und benutzerdefinierten Befehl:

public static class CustomCommands
{
    // Ctrl+Shift+C to avoid collision with Ctrl+C.
    public static readonly RoutedUICommand CommentSelection = 
        new RoutedUICommand("_Comment Selection", 
            "CommentSelection", typeof(MainWindow), 
            new InputGestureCollection() 
            { new KeyGesture(Key.C, (ModifierKeys.Control | ModifierKeys.Shift)) });
}

Jetzt verkabeln Sie Ihre Event-Handler:

private void CommentSelectionCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    // Determines status of command.
    e.CanExecute = true;
}

private void CommentSelectionExecuted(object sender, ExecutedRoutedEventArgs e)
{
    // TO-DO: Insert magic here.
}

Dann sollte es klappen. Ich hoffe, das hilft und ich habe nichts übersehen!

-1voto

Dhaval Patel Punkte 7315
<KeyBinding Command="{Binding ExitCommand}"

                Key="{Binding ExitCommand.GestureKey}"

                Modifiers="{Binding ExitCommand.GestureModifier}"/>
get

    {

        if (exitCommand == null)

        {

            exitCommand = new DelegateCommand(Exit);

            exitCommand.GestureKey = Key.X;

            exitCommand.GestureModifier = ModifierKeys.Control;

            exitCommand.MouseGesture = MouseAction.LeftDoubleClick;

        }

        return exitCommand;

    }

}
 private void Exit()
{
    Application.Current.Shutdown();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X