2013-01-01 3 views
0

10/2010 WPF 리본에 대한 응용 프로그램 메뉴의 놓기 위치를 수정할 수 있습니까? 메뉴가 가장 왼쪽에 열리는 것은 매우 드문 일이므로 생각을 바꾸고 싶습니다.WPF 리본 응용 프로그램 메뉴 드롭 다운 위치를 수정하려면 어떻게합니까?

예 : Word 2007에서 모든 리본 메뉴 디자인에 대해 알고있는 것처럼 응용 프로그램 메뉴는 가능한 한 오른쪽에서 열립니다. 오른쪽에이 메뉴에 대한 유일한 합리적인 위치이기 때문에 나는이 행동을 너무하고 싶습니다. 모든 항목은 버튼 바로 아래에있는 왼쪽 열에 있습니다. 왼쪽 위치를 지정하는 쉬운 방법을 찾지 못했습니다. 이것이 가능한지 누구와 어떻게 알 수 있습니까?

+0

이 레이아웃 문제는 Windows Vista에만 있습니다. Windows 7에서는 리본 응용 프로그램 메뉴가 추가 코드없이 원하는 위치에 배치됩니다. – LWChris

답변

0

오케이, 몇 시간 동안 시도해 본 후 가능한 방법을 찾았습니다. "Windows 7 Paint"또는 유사한 Windows 7 리본 응용 프로그램과 같은 100 % 원래 동작이 아니지만 대부분의 경우 작동합니다.

첫째, 당신은 응용 프로그램 메뉴가 팝업이 열릴 위치를 정의하는 Placement 속성을 가진 Popup, 실현되는 것을 알 필요가있다. 기본 동작을 PlacementMode.Left으로 재정의해야합니다. 이렇게하면 팝업 메뉴가 메뉴 버튼 바로 옆에서 열립니다.

다음으로 Popup.HorizontalOffset 속성을 음수 인 RibbonApplicationMenu.Width으로 설정해야합니다. 이 작업은 Binding과 변환기를 사용하여 값을 무효화합니다.

<r:RibbonWindow.Resources> 
    <local:NegateIntegerConverter x:Key="NegateIntegerConverter"/> 
</r:RibbonWindow.Resources> 

local 네임 스페이스가 RibbonWindow의 내부에 선언 할 수있다 : 마지막으로

<r:RibbonWindow x:Class="MainWindow" 
    xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
    xmlns:local="clr-namespace:ApplicationRootNamespace" 
> 

을 그리고,의 코드를 다음과 같이

<r:RibbonApplicationMenu> 
    <r:RibbonApplicationMenu.Resources> 
     <Style TargetType="Popup"> 
      <Setter Property="Placement" Value="Left"/> 
      <Setter Property="HorizontalOffset" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=r:RibbonApplicationMenu}, Path=Width, Converter={StaticResource ResourceKey=NegateIntegerConverter}}"/> 
     </Style> 
    </r:RibbonApplicationMenu.Resources> 
</r:RibbonApplicationMenu> 

컨버터는 RibbonWindow.Resources에 정의되어 있습니다 NegateIntegerConverter은 응용 프로그램의 루트 네임 스페이스에있는 클래스입니다.

Public Class NegateIntegerConverter 
    Implements IValueConverter 

    Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert 
    Return -CInt(value) 
    End Function 

    Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack 
    Return -CInt(value) 
    End Function 
End Class 

Class MainWindow 

End Class 

동작의 차이점 : 화면이 끝나기 때문에 메뉴를 완전히 확장 할 수없는 경우 팝업은 단순히 왼쪽으로 조금 더 멀리 열지 만 완전히 왼쪽으로는 열리지 않습니다. 어쩌면 "Windows 7 Paint"리본 메뉴처럼 실제로 어떻게 작동하는지 알 수 있지만 그때까지는 좋은 해결 방법입니다.