2011-03-01 4 views
3

컨텍스트 메뉴의 너비가 버튼과 동일한 너비가되도록 간단한 버튼이 있습니다. 버튼의 왼쪽 클릭을 컨텍스트 메뉴의 버튼 바로 아래에서 엽니 다.컨텍스트 메뉴가있는 WPF 단추, 컨텍스트 메뉴 너비를 단추의 너비에 바인딩하는 방법?

<Button x:Name="btn" Content="Push Me"> 
    <Button.ContextMenu> 
     <ContextMenu x:Name="cm"> 
      <MenuItem Header="One" /> 
      <MenuItem Header="Two" /> 
      <MenuItem Header="Three" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

나는 상황에 맞는 메뉴 자체에 다음과 같은 바인딩을 시도하고 그것은 내가 코드에서 작업 얻을 수있었습니다,

<ContextMenu x:Name="cm" Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Button}}, Path=ActualWidth}"> 

작동하지만하지 않습니다

btn.LayoutUpdated += (s, e) => cm.Width = btn.ActualWidth; 

내 질문은 ...이 기능을 얻을 수있는 xaml 바인딩이 있습니까?

답변

4

ContextMenu이 속성은 Button은 그래서 당신은 통찰력에 대한 Binding

<ContextMenu x:Name="cm" 
      Width="{Binding RelativeSource={RelativeSource Self}, 
          Path=PlacementTarget.ActualWidth}"> 
+0

+1 훨씬 더 나은이 인스턴스에서 NameScope을 설정하면 –

+0

그것은 효과가! thanks –

+0

@Jon PlacementTarget (Button) 외부의 어떤 것도 시각적 트리 검색에 의존해야하므로 ... NameScope를 조정하지만이 솔루션은 사용자 시나리오에 이상적입니다. –

2

이것은 이 NameScope과 관련하여 작동하는 방식과 관련이 있습니다. 디버거에서 ContextMenu을 분석하면 해당 부모는 Popup이고 Popup 부모는 null입니다.

workarounds 중 하나는 MSDN 포럼에서 NameScope을 조정하면 ContextMenu이 예상대로 동작 할 수 있습니다.

NameScope.SetNameScope(this, new NameScope()); 

이것은 분명히 다른 접근 방법과 마찬가지로 코드에서 발생합니다. 둘 다 최적이 아닙니다.

+0

감사의 경로에서 사용하려고 할 수있을 것이다이 경우 어떤 PlacementTarget을 요구했다, 이것은 내 첫 WPF 경험이고 내가 필요 내가 얻을 수있는 모든 통찰력 =) –

+0

+1 또한 귀하의 NameScope을 설정할 수 있다는 것을 알았습니다. –