programing

메뉴 항목 바로 가기 정의

powerit 2023. 5. 3. 21:59
반응형

메뉴 항목 바로 가기 정의

메뉴 항목의 바로 가기를 설정할 수 있는 간단한 방법이 필요합니다.

그러나 클릭만으로 바로 가기에서는 작동하지 않습니다.

<MenuItem Header="Editar">
    <MenuItem Header="Procurar" Name="MenuProcurar"
              InputGestureText="Ctrl+F"
              Click="MenuProcurar_Click">
        <MenuItem.ToolTip>
            <ToolTip>
                Procurar
            </ToolTip>
        </MenuItem.ToolTip>
    </MenuItem>
</MenuItem>

WPF 4.0을 사용하고 있습니다.

H.B.가 옳았어요...정밀도를 더 추가하고 싶었을 뿐입니다.

를 합니다.Click의 신의이에 MenuItem 그고와그것연다니관킵시을리▁a▁it▁and▁with다▁associate.Command대신.

1 - 명령을 추가/생성합니다.

<Window.CommandBindings>
     <CommandBinding Command="Open" Executed="OpenCommandBinding_Executed"/>
     <CommandBinding Command="SaveAs" Executed="SaveAsCommandBinding_Executed"/>
</Window.CommandBindings>

명령어는 다음 코드를 참조합니다.

private void OpenCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    Open();//Implementation of open file
}
private void SaveAsCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    SaveAs();//Implementation of saveAs
}

2 - 명령을 원하는 키와 연결합니다.

<Window.InputBindings>
    <KeyBinding Key="O" Modifiers="Control" Command="Open"/>
    <KeyBinding Key="S" Modifiers="Control" Command="SaveAs"/>
</Window.InputBindings>

- 으로 명령어를 합니다(3 - 마으로메항목뉴막지항(목▁-)).InputGestureText장식용 텍스트일 뿐입니다):

<Menu Name="menu1">
    <MenuItem Header="_File">
        <MenuItem Name="menuOpen" Header="_Open..." Command="Open" InputGestureText="Ctrl+O"/>
        <MenuItem Name="menuSaveAs" Header="_Save as..." Command="SaveAs" InputGestureText="Ctrl+S"/>
    </MenuItem>
</Menu>

이렇게 하면 여러 입력을 동일한 명령에 연결할 수 있습니다.

단축키가 작동해야 하는 컨트롤에서 클래스에 있는 것과 같은 것을 사용(재사용하는 경우)해야 합니다.

예.

<Window.CommandBindings>
        <CommandBinding Command="New" Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<Window.InputBindings>
        <KeyBinding Key="N" Modifiers="Control" Command="New"/>
</Window.InputBindings>

지정 스텀의 RoutedCommands:

static class CustomCommands
{
    public static RoutedCommand DoStuff = new RoutedCommand();
}

용도:

<Window
    ...
    xmlns:local="clr-namespace:MyNamespace">
        <Window.CommandBindings>
                <CommandBinding Command="local:CustomCommands.DoStuff" Executed="DoStuff_Executed" />
        </Window.CommandBindings>
        <Window.InputBindings>
                <KeyBinding Key="D" Modifiers="Control" Command="local:CustomCommands.DoStuff"/>
        </Window.InputBindings>
    ...
</Window>

(인터페이스를 구현하는 것이 종종 사용하는 것보다 더 편리합니다.RoutedCommands대리인을 다음으로 데려가는 생성자를 가질 수 있습니다.Execute그리고.CanExecute작업을 다른일하명쉽만위해들기게, 그구종불다립니종현은한러을라고 합니다.DelegateCommand또는RelayCommand 이게하필없다니습요면렇다▁need니▁not없▁this습▁do▁way▁you필이 필요하지 않습니다.CommandBindings.)

제 겸손한 의견으로는 헤더에서 사용하는 것이 훨씬 더 쉽습니다.그러면 원하는 핫키가 자동으로 생성됩니다.

예:

<MenuItem Header="_Editar">
<MenuItem Header="_Procurar" Name="MenuProcurar"
          InputGestureText="Ctrl+F"
          Click="MenuProcurar_Click">
    <MenuItem.ToolTip>
        <ToolTip>
            Procurar
        </ToolTip>
    </MenuItem.ToolTip>
</MenuItem>
</MenuItem>

저는 Windows에 지나치게 치우쳐 있습니다.양식 및 VB 6을 삼키기 때문에 반드시 그렇지 않은 이벤트 핸들러를 정적으로 연결할 수 있는 보다 간단한/절차적인 방법이 있어야 한다는 Jonathan과 Jase의견에 동의합니다.CommandBindings그리고 제 생각엔 그런 것 같아요.

비-사용자 정의 사용을 위한 좋은 튜토리얼CommandBinding이와 같은 취급자들, 그러나 버튼에 중점을 둔, 저는 MSDN 블로그 게시물에서 찾을 수 있다고 믿습니다.내가 증류해서 목표물로 삼겠습니다.MenuItems...

I 명령 생성

먼저, 클를만다를 구현하는 .ICommand물론, 여러분은 이것을 어디에나 둘 수 있습니다. 심지어 여러분이 원한다면, 여러분의 MainWindow.xaml.cs 파일에도 넣을 수 있습니다. 여러분의 데모 코드를 엄청나게 간단하게 유지하기 위해서요.당신은 아마도 만들기를 원할 것입니다.CanExecute나중에 메뉴 항목을 비활성화/활성화/활성화하려는 경우에는 더 복잡하지만, 지금은 항상 메뉴 항목을 활성화합니다.

public class HelloWorldCommand : ICommand
{
    public void Execute(object parameter)
    {
        MessageBox.Show(@"""Hello, world!"" from " 
            + (parameter ?? "somewhere secret").ToString());
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
} 

튜토리얼에서 유용하게 지적했듯이, 이미 어디서든 이 명령을 호출할 수 있습니다. 코드는...

var hwc = new HelloWorldCommand();
if (hwc.CanExecute(this))
    hwc.Execute(this);

창에서 명령 선언

그서일선을 "언의종보 "래습니 "해다겠 "가추을 "언"▁for "ar▁a "에 일종의 "선언문을 추가해 HelloWorldCommand나중에 사용할 수 있도록 창으로 이동합니다.Window " "로 합니다.

<Window.Resources>
    <local:HelloWorldCommand x:Key="hwc"/>
</Window.Resources>

네임스페이스"에 할 수 있는 가 있습니다."hwc"당신이 원하는 어떤 끈도 사용할 수 있지만 말입니다.우리는 그것을 우리의 시험에 많이 사용할 것입니다.

명령 연결(및 재사용!)

우리의 것을 추가합니다.MenuItem의 xamls. 의리우 xaml.했습니다.GridDockPanel왜냐하면 그것이 (나에게) 가장 쉬운 방법이기 때문입니다.Window요. UI는 의머분부모빼했놓지긴만요두제을지나▁though했▁ui지요만제빼의긴▁out놓▁i▁ui.

에 하십시오.Command="{StaticResource hwc}"의 자에게뿌려진에 s.MenuItem선언.핵심은 그 안에 있습니다. 그것이 우리의 지름길이라는 것을 기억하세요.HelloWorldCommand가 우가설치것한에 한.Window수평을 유지할 수 있는 그대로입니다. 물론, 물론,StaticResource▁▁it▁▁to▁says▁▁up.Window는 어떤 것도 우리의 지름길을 할 뿐입니다.우리는 어떤 것도 구속하지 않습니다. 우리는 단지 우리의 지름길을 사용할 뿐입니다.

<DockPanel LastChildFill="True">
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="_File">
            <MenuItem 
                Header="_Open" 
                Command="{StaticResource hwc}" 
            >
                <MenuItem.CommandParameter>
                    <!-- so you could make this object as complex as you wanted, 
                        like, say, your entire Window. See magic incantation, below. -->
                    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType=Window}" />
                </MenuItem.CommandParameter>

            </MenuItem>

            <MenuItem 
                Header="_Close" 
                Command="{StaticResource hwc}" 
                CommandParameter="Close"
                InputGestureText="Ctrl+G" />

            <MenuItem 
                Header="_Save" 
                Command="{StaticResource hwc}" 
                CommandParameter="Save" />

            <Separator />

            <MenuItem 
                Header="_Quit" 
                Command="{StaticResource hwc}" 
                CommandParameter="Quit" />
        </MenuItem>
</DockPanel>

이벤트 소스를 구분하는 명령 매개 변수

모든 작업에 동일한 명령을 사용합니다!하지만 어떤 위젯이 이벤트를 던졌는지 어떻게 알 수 있을까요?이를 위해서는 다음을 사용해야 합니다.CommandParameter우리의 리의를 하세요.Execute메드의서명서:Execute(object parameter).그거CommandParameter매개 변수는 이벤트를 처리하는 방법을 아는 데 사용할 수 있는 것입니다.이것을 실행해보고 주의하세요.MessageBox든모것사것입다니용할을에 있는 무엇이든 입니다.CommandParameter이벤트의 출처를 알려드립니다.우리는 그것을 모두 수동으로 하고 있지만, 그것은 그리 나쁘지 않습니다.

또한 이러한 개체를 원하는 만큼 복잡하게 만들 수 있습니다.당신은 속사수있다습에 있는 할 수 .MenuItem태그를 사용하여 매개 변수를 정의하거나 "실제"를 사용할 수 있습니다.<MenuItem.CommandParameter>위의 열기 메뉴 항목과 같은 태그를 사용하여 복잡한 것을 정의할 수 있습니다. 경우 VB6-ish 컨텍스트를 이벤트 핸들러 코드에 넣는 가장 쉬운 방법인 전체 상위 개체를 전달합니다.

에 바로 키 MenuItem의(명일 "OP 답응")

그리고 이제 우리는 마침내 원래의 질문에 대답할 수 있습니다! 단축키를 연결해 보겠습니다.Close메뉴 항목당신은 우리가 이미 선언했다는 것을 알게 될 것입니다.InputGestureText 자체로 화장품일 뿐입니다.만약 우리가 지나치게 까다롭다면, 우리는 키보드 단축키를 만드는 메커니즘이 직접적이고 내재적인 관계가 없다고 주장할 수 있습니다.MenuItem전혀!

를 .Window키 스트로크를 잡기 위한 레벨.따라서 Windows 태그의 맨 위에 다음을 삽입합니다(기본적으로 여기에서 따옴).

<Window.InputBindings>
    <KeyBinding Modifiers="Control"
                Key="G"
                Command="{StaticResource hwc}" 
                CommandParameter="window input binding"
    />
</Window.InputBindings>

다음과 같이 입력할 수 있습니다.CommandParameter에 있는 KeyBinding 및 폐쇄형 XML로 KeyBinding꼬리표

그리고 우리는 끝났다.앱을 실행하고 Ctrl-G를 누릅니다.와드업.

선수들을 똑바로 하고 나면 꽤 간단합니다. 그리고 대부분의 명령어와 명령어를 도입하는 것보다 훨씬 덜 마술적인 구속력이 있습니다.MenuItems 생각엔생각합니다.


가능한 팁:

체전.CommandBinding잠시 혼란스러웠습니다.이것은 특정 명령 유형을 위한 입니다.즉, 당신은 그냥 어떤 것도 연결할 수 없습니다.Command당신이 좋아하는.여기서 자랑하는 것과 같은 것(분명히 괜찮은 입문서!)...

완전히 명확하지는 않지만 명령어를 사용하면 많은 것을 무료로 얻을 수 있습니다.키보드 단축키, 텍스트 및 입력 제스처항목 및 WPF에 대한 텍스트는 활성 컨트롤 및 상태에 따라 항목을 자동으로 활성화/비활성화합니다.이 경우 텍스트를 선택하지 않았기 때문에 잘라내기 및 복사는 사용할 수 없지만 클립보드가 비어 있지 않기 때문에 붙여넣기는 사용할 수 있습니다.

WPF 메뉴를 처음 접하는 경우에는 혼란스러울 수 있습니다.

다음을 선언할 수도 있습니다.RoutedUICommandXAML 형식:

<Window.Resources>
    <RoutedUICommand x:Key="BuildCmd" Text="Build">
        <RoutedUICommand.InputGestures>
            <KeyGesture>CTRL+SHIFT+B</KeyGesture>
        </RoutedUICommand.InputGestures>
    </RoutedUICommand>      
</Window.Resources>

바인딩을 수행합니다.

<Window.CommandBindings>
    <CommandBinding Command="{StaticResource BuildCmd}" Executed="BuildCmdExecuted"/>
</Window.CommandBindings>

그고리에서.MenuItem

<MenuItem Command="{StaticResource BuildCmd}"/>

여기에서는 다른 솔루션에 대해 설명합니다.

PowerShell 솔루션은 다음과 같습니다.

  1. XAML 파일을 정의합니다.
<Window x:Class="WpfApp1.Window1"
    xmlns:local="clr-namespace:WpfApp1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="My App" Height="620" Width="950" >
    <Window.InputBindings>
        <KeyBinding Key="S" Modifiers="Ctrl"/>
    </Window.InputBindings>
    <Grid x:Name="MainGrid">
    <!--Your GUI is here-->
        <Menu Margin="0">
            <MenuItem Header="_File">
                <MenuItem x:Name="SaveProfile" Header="_Save Profile" InputGestureText="Ctrl+S"/>
            </MenuItem>
        </Menu>
    </Grid>
</Window>
  1. 명령을 만들 수 있는 새 유형 추가
Add-Type @"
public class DelegateCommand : System.Windows.Input.ICommand
{
    private System.Action<object> _action;
    public DelegateCommand(System.Action<object> action)
    {
        _action = action;
    }
    public bool CanExecute(object parameter)
    {
        return true;
    }
    public event System.EventHandler CanExecuteChanged = delegate { };
    public void Execute(object parameter)
    {
        _action(parameter);
    }
}
"@
  1. 이전에 정의된 KeyBinding에 새 명령을 생성하고 할당합니다. 첫 번째 키 바인딩이므로 [0]으로 주소를 지정합니다.참고: 저의 경우 핸들을 메인 윈도우에 $hash로 저장했습니다.창 변수, [Windows]를 사용하여 만든 기본 창 개체에 대한 링크를 여기에 넣어야 합니다.Markup.XamlReader]::Load($xamlXmlNodeReader) 명령 또는 기타 창 생성 명령.
$hash.Window.InputBindings[0].Command = New-Object DelegateCommand( { Save-Profile } )
  1. 명령에 입력한 함수 만들기
function Save-Profile {
    Write-Host "Save Profile"
    # Your logic goes here
}

Type for Command를 만드는 방법에 대한 팁을 주신 Nicholas Wolverson에게 감사드립니다.

나를 위한 이 일

<ContextMenu  PreviewKeyUp="ContextMenu_PreviewKeyUp">
    <MenuItem Header="Delete"  Click="DeleteID"   />
</ContextMenu>

코드 배경:

private void ContextMenu_PreviewKeyUp(object sender, KeyEventArgs e)
{
    ContextMenu contextMenu = sender as ContextMenu;
    if (e.Key == Key.D)
    {
        //DELETE ID

    }
    contextMenu.IsOpen = false;
}

언급URL : https://stackoverflow.com/questions/4682915/defining-menuitem-shortcuts

반응형