2010-03-02 249 views
3

默認情況下,Popup控件左對齊。其左邊緣與其父邊的左邊緣對齊。動態設置彈出位置/佈局

我想要做的是讓控件右對齊,使其右邊緣與其容器的右邊緣對齊。

我希望這是動態的,因爲我動態綁定數據,我不知道彈出窗口有多大。

我試圖與OpenedSizeChangedLoaded事件打得到Child的寬度,將其設置爲HorizontalOffset但似乎時間問題。基本上,它在第一次加載控件時運行正常,然後從未(之後HorizontalOffset設置爲0)。

這是一個錯誤?我做錯了嗎?

編輯我明白了。看起來有時間問題。如果我勾了Opened事件,並設置HorizontalOffset異步使用Dispatcher,那麼它的工作原理:(

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

EDIT 2我現在意識到,我正在做一些愚蠢的事,我想的的PopupComboBox右對齊我沒有看到它在ArrangePopup私人方法調用中被重新初始化
我試圖從ComboBox繼承來覆蓋放置函數,但我必須做一些錯誤的事情,因爲它似乎仍然沒有儘管我工作errode調用方法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生成組合框的默認模板。在模板中,你會發現一個名爲彈出彈出,改變它的屬性的FlowDirection以從右至左...

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

注意彈出內部的ScrollViewer對象將繼承的FlowDirection設置,所以你必須明確地設置它的FlowDirection到LeftToRight。 ..

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

...否則它將從RightToLeft填充,滾動條將在左側。