2010-06-08 4 views
3

바로 가기 키 바로 가기를 사용하여 메뉴를 만드는 데 올바른/최선의 방법은 무엇입니까?WPF에서 바로 가기가있는 메뉴를 만드는 올바른 방법

Visual Studio의 새로 만들기, 열기, 저장, 모두 저장, 끝내기 및 몇 가지 다른 표준 바로 가기가있는 파일 메뉴 만 원할뿐입니다.

InputGestureText는 적절한 텍스트를 표시하지만 "텍스트"라고 불리우며 이벤트를 트리거하지 않는 것으로 보입니다. 올바른 방법이 아닌 것으로 가정합니다. 커맨드 아키텍처는 상당히 부피가 커 보이기 때문에 더 좋은 방법이 있다면 커맨드 경로를 따라 가고 싶지 않습니다.

업데이트 : 명확성을 위해 , 이제 나는 다음과 같은 메뉴를 사용하고 가정 해 봅시다 :

<Menu> 
    <MenuItem Header="_File"> 
    <MenuItem Header="_New" /> 
    <MenuItem Header="_Open" /> 
    <Separator /> 
    <MenuItem Header="_Save" /> 
    <MenuItem Header="Save _All" /> 
    <Separator /> 
    <MenuItem Header="_Export"/> 
    <MenuItem Header="_Import"/> 
    <Separator /> 
    <MenuItem Header="E_xit"/> 
    </MenuItem> 
</Menu> 

내보내기 및 가져 오기 사용자 정의 단축키 될 경우; Microsoft가 ApplicationCommands와 같은 것을 구축하지 않은 것입니다. 필요한 경우 C# 사용자 정의 코드를 포함하여 완벽한 솔루션을 제공 할 수 있습니까? (도움이 될뿐만 아니라 비슷한 문제를 찾고있는 사람들을 돕기를 바랍니다.)

답변

13

InputGestureText가 실제로 바로 가기를 설정하지 않는다는 점에있어서 정확합니다. 단순히 메뉴에 레이블을 붙입니다. 올바른 방법은 윈도우의 InputBindings를 사용하는 것입니다. 사용자 정의 모델 정의 명령을 포함한 모든 명령에 키보드 단축키를 매핑 할 수 있습니다. 하지만이 작업을 수행하려면 명령에 바인딩 된 메뉴 항목을 사용해야합니다. 직접 클릭 이벤트를 처리하지 않아야합니다. 이것은 WPF에서 메뉴 명령을 처리 할 때 권장되는 방법입니다. 그렇지 않으면 구식 키보드 이벤트 처리에 의존해야합니다.

<Window.InputBindings> 
    <KeyBinding Key="A" Modifiers="Control" Command="{Binding MyAwesomeCommand}" /> 
</Window.InputBindings> 

More information (MSDN)

+0

흠. 커스텀 커맨드에 커스텀 쇼트 커크를 연결하는 새로운 방법입니다. 완전히 나를 보내지는 않지만 MSDN에 대한 링크는 매우 유용했습니다. –

+0

InputBinding을 사용하면 키보드 단축키를 통해 명령을 호출 할 수 있습니다. 메뉴에 바로 가기를 표시하려면 적절한 메뉴에 InputGestureText 속성을 추가하십시오. '' – mrfelis

4

ApplicationCommands 클래스를 살펴보십시오. 표준 키 제스처 (가속기)와 텍스트를 무료로 얻을 수 있습니다.

<MenuItem Command="ApplicationCommands.Paste" Width="75" /> 
+0

응용 프로그램에 추가하면 사용자가 TextBox에 포커스를 맞추고 실제로 복사하여 붙여 넣을 수있는 경우에도 메뉴 항목이 비활성화됩니다. 또한 커스텀 커맨드를 위해 무엇이 필요합니까? –

+0

@matt Right .. 각 명령은 Execute + CanExecute 콤보입니다. CanExecute가 false로 평가되면 메뉴 항목이 비활성화됩니다. PasteCmd.CanExecute는 false를 반환합니다 (메뉴 항목이 회색으로 표시됨). 커스텀 커맨드는 http://msdn.microsoft.com/en-us/library/system.windows.input.routedcommand.aspx를 참조하십시오. – Gishu

관련 문제