액셀러레이터를 사용하여 WPF에서 사용자 정의 MenuHeaders를 어떻게 만듭니까?

StackOverflow https://stackoverflow.com/questions/59456

문제

예를 들어 메뉴 항목에 아이콘과 텍스트를 포함할 수 있도록 WPF에서 일부 사용자 지정 MenuHeaders를 만들고 싶습니다.

일반적으로 MenuItems를 사용하여 헤더 필드를 직선 텍스트로 채우는 경우 밑줄을 사용하여 단축키를 추가할 수 있습니다.예: _파일

그러나 UserControl을 삽입하려고 하면 이 기능이 중단될 것이라고 생각합니다. 다음과 유사한 작업을 어떻게 수행합니까?

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...
도움이 되었습니까?

해결책

나는 Icon 속성이 귀하의 요구에 맞는다고 생각합니다.
그러나 원래 질문에 대답하려면 메뉴 항목의 콘텐츠를 구성할 때 Accelerator 기능을 유지하는 것이 가능합니다. MenuItem에 중첩된 콘텐츠가 있는 경우 AccessText 속성을 명시적으로 정의해야 합니다. 아래 첫 번째처럼요.인라인 양식을 사용하면 자동으로 처리됩니다.

 <Menu> 
   <MenuItem>
      <MenuItem.Header>
        <StackPanel Orientation="Horizontal">
          <Image Source="Images/Open.ico" />      
          <AccessText>_Open..</AccessText>
        </StackPanel>
      </MenuItem.Header>
    </MenuItem>
    <MenuItem Header="_Close" />
   </Menu>

다른 팁

문제는 MenuHeader의 콘텐츠 내부에 이미지를 배치했다는 것입니다. 즉, 가속 키를 잃게 됩니다.메뉴 헤더에 이미지를 넣으려는 경우 다음을 수행하십시오.

<MenuItem Header="_Open">
  <MenuItem.Icon>
    <Image Source="images/Open.png"/>
  </MenuItem.Icon>
</MenuItem>

모양과 느낌을 더욱 맞춤화하려면 다음을 수정하세요. 컨트롤 템플릿 그리고 메뉴 스타일.경험상 메뉴와 메뉴 항목의 스타일을 지정하는 것은 다른 WPF 컨트롤의 스타일을 지정하는 것보다 훨씬 더 어렵습니다.

처음에는 Icon 속성이 이미지만 포함할 수 있다고 생각할 것입니다.하지만 실제로는 무엇이든 포함될 수 있습니다!프로그래밍 방식으로 Image 속성을 이미지 경로가 포함된 문자열로 직접 설정하려고 했을 때 우연히 이 사실을 발견했습니다.그 결과 이미지가 표시되지 않고 경로의 실제 텍스트가 표시되었습니다!그러다가 먼저 Image 요소를 생성하고 이를 Icon 속성으로 설정해야 한다는 것을 알게 되었습니다.이로 인해 Image 속성은 메뉴 왼쪽의 아이콘 영역에 있는 콘텐츠 컨테이너일 뿐이라고 생각하게 되었고 내 생각이 옳았습니다.거기에 버튼을 넣으려고 했는데 성공했어요!

메뉴 항목의 아이콘 영역에 "i"라는 텍스트가 있는 버튼이 표시됩니다.버튼을 클릭하면 Button_Click 이벤트가 트리거됩니다(버튼을 클릭해도 LanguageMenu_Click은 트리거되지 않습니다).

<MenuItem Name="LanguageMenu" Header="_Language" Click="LanguageMenu_Click">
  <MenuItem.Icon>
    <Button Click="Button_Click">i</Button>
  </MenuItem.Icon>
</MenuItem>

이는 아이콘에 대한 이미지를 만들 필요 없이 간단한 "아이콘"을 표시하는 대신 기호 글꼴이 있는 텍스트를 사용하는 대안으로 이어집니다.다음 예에서는 플로피디스크 기호가 포함된 Wingdings 글꼴을 사용합니다.글꼴의 이 기호는 문자에 매핑됩니다. <, 는 XAML에서 특별한 의미를 가지므로 인코딩된 버전을 사용해야 합니다. &lt; 대신에.이것은 꿈처럼 작동합니다!다음은 메뉴 항목의 아이콘으로 플로피 디스크 기호를 보여줍니다.

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>

@a7an:아, 이전에는 Icon 속성을 눈치채지 못했어요.좋은 시작이네요.

그러나 특히 '고정' 기능을 가질 수 있도록 일부 MenuItems에 추가 '버튼'을 추가하고 싶었습니다(기능 아이디어는 Office 2007에 최근 로드된 문서 목록 참조).

코드도 있어야 하므로 컨트롤을 하위 클래스로 분류하고 버튼에 대한 코드를 추가해야 합니까?(MenuItem 템플릿을 망칠 염려가 없습니다. 이미 한 번 수행해야 했고, 필요하다면 다시 수행할 것입니다!;) )

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top