子窗口内的内容会发生变化,这会导致我的子窗口失去中心对齐....内容发生更改后,无论如何都需要将子窗口重新定位到中心位置......我尝试以下,并没有奏效:Silverlight:将子窗口重置为中心
this.horizontalalignment = horizontalalignment.center;
this.verticalalignment = verticalalignment.center;
感谢
子窗口内的内容会发生变化,这会导致我的子窗口失去中心对齐....内容发生更改后,无论如何都需要将子窗口重新定位到中心位置......我尝试以下,并没有奏效:Silverlight:将子窗口重置为中心
this.horizontalalignment = horizontalalignment.center;
this.verticalalignment = verticalalignment.center;
感谢
一个的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已更改,以查看是否确实需要清除变换。
这解决了我的问题,'它只是工作'。我建议人们添加一些空引用检查,但除此之外,它只是工作。 –
代码
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;
}
您通过高度和宽度属性改变ChildWindow的大小? – AnthonyWJones