2010-03-02 6 views
3

Popup 컨트롤은 기본적으로 왼쪽 정렬됩니다. 왼쪽 가장자리가 부모 가장자리와 정렬됩니다.팝업 위치/배치를 동적으로 설정하십시오.

컨트롤의 오른쪽 가장자리가 컨테이너의 오른쪽 가장자리에 정렬되도록 컨트롤을 배치하고 싶습니다.

동적으로 데이터를 바인딩하고 팝업이 얼마나 커질 지 모르기 때문에 동적 인 것으로 지정합니다.

은 내가 Child의 폭을 얻고 HorizontalOffset로 설정하는 Opened, SizeChangedLoaded 이벤트와 함께 연주 시도했지만 타이밍 문제가 될 것 같습니다. 기본적으로 그것은 처음에는 컨트롤이로드 된 후 잘 동작하지 않습니다 ( HorizontalOffset이 0으로 설정 됨).

이것은 버그입니까? 내가 잘못하고있는거야?

편집 나는 그것을 작동시켰다. 타이밍 문제가있는 것 같습니다. 나는 Opened 이벤트를 연결하고 비동기 적으로 Dispatcher 사용하여 HorizontalOffset을 설정하면, 그것은 작동 :(지금 내가 멍청한 짓을하고 있었던 것을 깨닫게 2 편집이. 나는의 Popup를 원

private static void OnPopupOpened(object sender, System.EventArgs e) 
    { 
     var popup = (Popup)sender; 
     popup.Dispatcher.BeginInvoke(() => popup.HorizontalOffset = -popup.ActualWidth); 
    } 

ComboBox을 오른쪽 정렬해야합니다. ArrangePopup 개인 메서드 호출에서 다시 초기화 된 것을 볼 수 없었습니다.
ComboBox에서 상속을 시도했지만 배치 기능을 무시하려고했으나 여전히 보이지 않기 때문에 잘못된 작업을해야합니다. 나는 ov이지만 일한다. 해당 메서드를 오류로 호출 ArrangePopup

건배.

답변

3

이제 내 자신의 질문에 대답하지 않으면 아무도 내 해결 방법을 대답으로 표시 할 수 없음을 알게되었습니다. 여기 전체 코드가 있습니다. PRISM 동작으로 구현했습니다.

public static class PopupRightAlignBehavior 
{ 
    public static readonly DependencyProperty InstanceProperty = 
     DependencyProperty.RegisterAttached("Instance", typeof(object), typeof(PopupRightAlignBehavior), new PropertyMetadata(OnSetInstanceCallback)); 

    public static object GetInstance(DependencyObject obj) 
    { 
     return (object)obj.GetValue(InstanceProperty); 
    } 

    public static void SetInstance(DependencyObject obj, object value) 
    { 
     obj.SetValue(InstanceProperty, value); 
    } 

    private static void OnSetInstanceCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var popup = (Popup)d; 
     popup.Opened -= OnPopupOpened; 
     popup.Opened += OnPopupOpened; 
    } 

    private static void OnPopupOpened(object sender, System.EventArgs e) 
    { 
     var popup = (Popup)sender; 
     popup.Dispatcher.BeginInvoke(() => popup.HorizontalOffset = -popup.ActualWidth); 
    } 
} 
0

MS Expression Blend를 사용하면 ComboBox의 기본 템플릿을 생성 할 수 있습니다. 템플릿에서는

<Popup x:Name="Popup" FlowDirection="RightToLeft"> 

참고 팝업 내부에서 ScrollViewer 개체는의 FlowDirection은 당신이 이렇게 설정을 명시 적으로 LeftToRight 자사의 FlowDirection을 설정 상속 ..., 팝업라는 이름의 팝업을 찾기가의 FlowDirection이 RightToLeft로에 속성의 변경됩니다. ..

<ScrollViewer x:Name="ScrollViewer" BorderThickness="0" Padding="1" FlowDirection="LeftToRight"> 

... 그렇지 않으면 RightToLeft에서 채울 것이고 스크롤바는 왼쪽에 있습니다.

관련 문제