메뉴 항목 바로 가기 정의
메뉴 항목의 바로 가기를 설정할 수 있는 간단한 방법이 필요합니다.
그러나 클릭만으로 바로 가기에서는 작동하지 않습니다.
<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 블로그 게시물에서 찾을 수 있다고 믿습니다.내가 증류해서 목표물로 삼겠습니다.MenuItem
s...
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.했습니다.Grid
DockPanel
왜냐하면 그것이 (나에게) 가장 쉬운 방법이기 때문입니다.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 메뉴를 처음 접하는 경우에는 혼란스러울 수 있습니다.
다음을 선언할 수도 있습니다.RoutedUICommand
XAML 형식:
<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 솔루션은 다음과 같습니다.
- 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>
- 명령을 만들 수 있는 새 유형 추가
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);
}
}
"@
- 이전에 정의된 KeyBinding에 새 명령을 생성하고 할당합니다. 첫 번째 키 바인딩이므로 [0]으로 주소를 지정합니다.참고: 저의 경우 핸들을 메인 윈도우에 $hash로 저장했습니다.창 변수, [Windows]를 사용하여 만든 기본 창 개체에 대한 링크를 여기에 넣어야 합니다.Markup.XamlReader]::Load($xamlXmlNodeReader) 명령 또는 기타 창 생성 명령.
$hash.Window.InputBindings[0].Command = New-Object DelegateCommand( { Save-Profile } )
- 명령에 입력한 함수 만들기
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
'programing' 카테고리의 다른 글
Egit 거부됨 비고속 전달 (0) | 2023.05.03 |
---|---|
Git 저장소를 특정 커밋으로 롤백(재설정)하려면 어떻게 해야 합니까? (0) | 2023.05.03 |
Postgresql 9.2pg_dump 버전 불일치 (0) | 2023.05.03 |
python pip - local dir에서 설치 (0) | 2023.05.03 |
편집 가능한 콤보 상자에서 TextChanged 이벤트를 가져오는 방법 (0) | 2023.05.03 |