2011-09-06 63 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;   
    }