IT

커스텀 루티드명령어를 WPF에 추가하려면 어떻게 해야 하나요?

itgroup 2023. 4. 18. 22:28
반응형

커스텀 루티드명령어를 WPF에 추가하려면 어떻게 해야 하나요?

메뉴와 서브메뉴가 포함된 어플리케이션이 있습니다.잘라내기, 복사 및 붙여넣기 등의 하위 메뉴 항목에 Application 명령어를 첨부했습니다.
어플리케이션 명령어가 없는 다른 메뉴 항목도 있습니다.
이러한 서브메뉴 항목에 커스텀명령어 바인딩을 추가하려면 어떻게 해야 합니까?
이 기사를 검토했지만 서브메뉴 항목에 이벤트를 첨부할 수 없습니다.

Window1 클래스(또는 윈도 클래스 이름이 붙은 것) 뒤에 배치하는 스태틱클래스를 사용하여 루티드클래스의 인스턴스를 만듭니다.UICommand 클래스:

public static class Command {

    public static readonly RoutedUICommand DoSomething = new RoutedUICommand("Do something", "DoSomething", typeof(Window1));
    public static readonly RoutedUICommand SomeOtherAction = new RoutedUICommand("Some other action", "SomeOtherAction", typeof(Window1));
    public static readonly RoutedUICommand MoreDeeds = new RoutedUICommand("More deeds", "MoreDeeeds", typeof(Window1));

}

Window1 클래스가 속한 네임스페이스를 사용하여 창 마크업에 네임스페이스를 추가합니다.

xmlns:w="clr-namespace:NameSpaceOfTheApplication"

이제 응용 프로그램명령어와 마찬가지로 명령어의 바인딩을 작성할 수 있습니다.

<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Open" Executed="CommandBinding_Open" />
    <CommandBinding Command="ApplicationCommands.Paste" Executed="CommandBinding_Paste" />
    <CommandBinding Command="w:Command.DoSomething" Executed="CommandBinding_DoSomething" />
    <CommandBinding Command="w:Command.SomeOtherAction" Executed="CommandBinding_SomeOtherAction" />
    <CommandBinding Command="w:Command.MoreDeeds" Executed="CommandBinding_MoreDeeds" />
</Window.CommandBindings>

메뉴의 바인딩을 사용합니다.다음은 예를 제시하겠습니다.

<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="w:Command.DoSomething" />

이러한 명령어를 스태틱클래스로 정의하는 것이 아니라 XAML로 직접 선언하는 것이 좋습니다.예: (Guffas nice 예에서 인용)

<Window.Resources>
    <RoutedUICommand x:Key="DoSomethingCommand" Text="Do Something" />
    <RoutedUICommand x:Key="DoSomethingElseCommand" Text="Do Something Else" />
</Window.Resources>
<Window.CommandBindings>
    <CommandBinding Command="{StaticResource DoSomethingCommand}" Executed="CommandBinding_DoSomething" />
    <CommandBinding Command="{StaticResource DoSomethingElseCommand}" Executed="CommandBinding_DoSomethingElse" />
</Window.CommandBindings>
...
<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="{StaticResource DoSomethingCommand}" />

제 답변이 너무 늦었다는 알지만, 그것이 미래에 도움이 되었으면 합니다.

I Like Guffa와 Heinzi의 답변은 좋지만 이전 결과를 얻기 위해서는 하나의 명령어만 사용할 수 있습니다.보통 Help 명령을 사용합니다.

 <Window.CommandBindings>
        <CommandBinding Command="{StaticResource Help}" Executed="HelpExecuted" />
  </Window.CommandBindings>

각 호출에서 Command Parametersr를 사용합니다.

<Window.InputBindings>
    <KeyBinding Command="{StaticResource Help}" Key="A" Modifiers="Ctrl" CommandParameter="Case1"/>
    <KeyBinding Command="{StaticResource Help}" Key="B" Modifiers="Ctrl" CommandParameter="Case2"/>
    <KeyBinding Command="{StaticResource Help}" Key="C" Modifiers="Ctrl" CommandParameter="Case3"/>
    <KeyBinding Command="{StaticResource Help}" Key="D" Modifiers="Ctrl" CommandParameter="Case4"/>
    <MouseBinding Command="{StaticResource Help}" MouseAction="LeftDoubleClick" CommandParameter="Case5" />
</Window.InputBindings>

또는

<Button Command="Help" CommandParameter="Case6" Content="Button">
    <Button.InputBindings>
        <KeyBinding Command="{StaticResource Help}" Gesture="Ctrl+D" CommandParameter="Case7"/>
    </Button.InputBindings>
</Button>

및 cs 파일에 있습니다.

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
{
    string str = e.Parameter as string;
    switch (str)
    {
        case null://F1 Pressed default Help
               //Code
            break;
        case "Case1":
               //Code
            break;
        case "Case2":
               //Code
            break;
        case "Case3":
               //Code
            break;
        case "Case4":
            break;
        case "Case5":
               //Code
            break;
        case "Case6":
               //Code
            break;
        case "Case7":
               //Code
            break;
    }
    e.Handled = true;
}

MVVM 패턴을 사용하는 경우

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
{
    string str = e.Parameter as string;
    Mvvm_Variable.Action(Input: str);
    e.Handled = true;
}

스위치를 View Module 사이트로 이동합니다.및 Action은 동일한 ViewModule 클래스의 메서드입니다.

언급URL : https://stackoverflow.com/questions/601393/how-do-i-add-a-custom-routed-command-in-wpf

반응형