2011-12-23 20 views
2

我試圖設計,這將出現在其PlacementTarget彈出出現在其父的右下角

的右下角我們承認你設置其PlacementTargetWindow一個彈出,那麼,Popup將作爲經典的烤麪包機通知。

鑑於WPF不夠智能爲我們提供一個「角落」解決方案,我試圖實現一個新的控件,它繼承自Popup,它將自己置於適當的位置。

這是我的第一個想法:在Loaded事件上工作,以確定我應該在哪裏放置Popup。 問題?我不想給彈出窗口設定任何固定的尺寸,根據顯示的文字,彈出窗口的尺寸應該是自己的。

但是,當Loaded事件引發時,我無法獲得ActualWidth屬性。 我無法在Opened事件發生時收到。

這是迄今爲止守則草案:

public class ExceptionPopup : Popup 
{ 
     public ExceptionPopup() 
     { 
      InitializeComponent(); 
      Loaded += new RoutedEventHandler(ExceptionPopup_Loaded); 
     } 

     void ExceptionPopup_Loaded(object sender, RoutedEventArgs e) 
     { 
      if (PlacementTarget != null) 
      { 
       if (PlacementTarget is FrameworkElement) 
       { 
        parentWidth = (PlacementTarget as FrameworkElement).ActualWidth; 
        parentHeight = (PlacementTarget as FrameworkElement).ActualHeight; 
       } 
      } 
     } 

     protected override void OnOpened(EventArgs e) 
     { 
      this.HorizontalOffset = parentWidth; 
      this.VerticalOffset = parentHeight; 
      base.OnOpened(e); 
     } 
} 

有沒有我可以用它來趕上我想在這裏的任何其他事件? 我基本上喜歡將HorizontalOffset設置爲parentWidth - ActualWidth/2,高度相同:) 任何想法?

謝謝!

+0

你可以給2張圖片,一個與目前的行爲和一個與所需的行爲嗎? – 2011-12-23 16:41:35

+0

通常,我將'PlacementTarget'設置爲'Bottom'或'Right',然後應用一個'LayoutTransform',將Popup移動剩餘的值。例如,我可以使用'Placement = Bottom',然後使用LayoutTransform將彈出窗口'(Window.Width - Popup.Width)'向右移動,並且'Popup.Height'向上移動。您可能甚至不需要根據彈出高度/寬度重新調整,因爲MSDN表示彈出窗口不允許在屏幕外顯示,並且會自動調整其位置以使其可見。 – Rachel 2011-12-23 17:26:17

+0

@Rachel不幸的是我不能那樣做。正如我前面所說的,我不想給我的'Popup'固定大小,所以在最好的情況下,'Height'和'Width'應該是'NaN'。然而,由於在OnOpened方法中,我不能在'ActualHeight'和'ActualWidth'上工作,它們仍然等於0.我不相信我只是在底部彈出一個彈出窗口,其父母的權利-__- – Damascus 2011-12-26 10:19:25

回答

3

一般我設置PlacementTarget要麼BottomRight,然後應用一個RenderTransform其中將這個Popup由剩餘價值。

例如,我可能會使用Placement=Bottom,然後用RenderTransform來彈出(Window.Width - Popup.Width)向右移動,並且向上Popup.Height。您可能甚至不需要根據彈出高度/寬度重新調整因爲MSDN表示彈出窗口不允許在屏幕外顯示,並且它會自動調整其位置以使其可見。 RenderTransform代替LayoutTransform,因爲RenderTransforms彈出後得到應用獲取呈現,所以ActualHeightActualWidth將大於0