2011-09-06 59 views
4

子窗口內的內容會發生變化,這會導致我的子窗口失去中心對齊....內容發生更改後,無論如何都需要將子窗口重新定位到中心位置......我嘗試以下,並沒有奏效:Silverlight:將子窗口重置爲中心

this.horizontalalignment = horizontalalignment.center; 
this.verticalalignment = verticalalignment.center; 

感謝

+0

您通過高度和寬度屬性改變ChildWindow的大小? – AnthonyWJones

回答

8

一個的RenderTransform對ChildWindow模板的存在似乎是罪魁禍首。 TransformGroup是默認模板的一部分,允許您在窗口中移動。

這裏是重置更改佈局後變換一個黑客:

 //after you do some change to the childwindow layout 
     sp.Children.Add(new Button() { Content = "a" }); 

     Dispatcher.BeginInvoke(() => 
     { 
      //reset the transform to zero 
      (this.GetTemplateChild("ContentRoot") as Grid).RenderTransform = new TransformGroup() 
      { 
       Children = { new ScaleTransform(), new SkewTransform(), new RotateTransform(), new TranslateTransform() } 
      }; 
     }); 

或多個自動:

public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     var contentRoot = this.GetTemplateChild("ContentRoot") as FrameworkElement; 
     contentRoot.LayoutUpdated += contentRoot_LayoutUpdated; 
    } 

    void contentRoot_LayoutUpdated(object sender, EventArgs e) 
    { 
     var contentRoot = this.GetTemplateChild("ContentRoot") as FrameworkElement; 
     var tg = contentRoot.RenderTransform as TransformGroup; 
     var tts = tg.Children.OfType<TranslateTransform>(); 
     foreach (var t in tts) 
     { 
      t.X = 0; t.Y = 0; 
     } 
    } 

LayoutUpdated被調用的時候,所以你可能要檢查是否contentRoot。 ActualWidth和ActualHeight已更改,以查看是否確實需要清除變換。

+0

這解決了我的問題,'它只是工作'。我建議人們添加一些空引用檢查,但除此之外,它只是工作。 –

0

代碼

public partial class DialogOptions : ChildWindow 
{ 
    public DialogOptions() 
    { 
     InitializeComponent(); 

     Loaded += (sender, args) => 
     { 
      VerticalAlignment = VerticalAlignment.Top; 
      this.SetWindowPosition(new Point(0, 200)); 
     }; 
    } 
} 

或延長:

public static void SetWindowPosition(this ChildWindow childWindow, Point point) 
    { 
     var root = VisualTreeHelper.GetChild(childWindow, 0) as FrameworkElement; 

     if (root == null) 
     { 
      return; 
     } 

     var contentRoot = root.FindName("ContentRoot") as FrameworkElement; 

     if (contentRoot == null) 
     { 
      return; 
     } 

     var group = contentRoot.RenderTransform as TransformGroup; 

     if (group == null) 
     { 
      return; 
     } 

     TranslateTransform translateTransform = null; 

     foreach (var transform in group.Children.OfType<TranslateTransform>()) 
     { 
      translateTransform = transform; 
     } 

     if (translateTransform == null) 
     { 
      return; 
     } 

     translateTransform.X = point.X; 
     translateTransform.Y = point.Y;   
    }