在SizeToContent之后保持窗口居中

use*_*197 8 wpf center sizetocontent

我有一个WPF窗口,由于SizeToContent ="WidthAndHeight",它会随着时间的推移改变它的大小.最初,WindowStartupLocation ="CenterScreen"显示窗口正确居中,之后我将其重新定位:

Private Sub Window_SizeChanged(ByVal sender As Object, ByVal e As System.Windows.SizeChangedEventArgs) Handles Me.SizeChanged
  Me.Top = (SystemParameters.WorkArea.Height - e.NewSize.Height) / 2
  Me.Left = (SystemParameters.WorkArea.Width - e.NewSize.Width) / 2
End Sub
Run Code Online (Sandbox Code Playgroud)

但它会产生一个"跳跃",因为窗口首先调整大小并居中.

有没有办法顺利完成?

Imr*_*hid 7

这对我有用:

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    base.OnRenderSizeChanged(sizeInfo);

    //Calculate half of the offset to move the form

    if (sizeInfo.HeightChanged)
        this.Top += (sizeInfo.PreviousSize.Height - sizeInfo.NewSize.Height) / 2;

    if (sizeInfo.WidthChanged)
        this.Left += (sizeInfo.PreviousSize.Width - sizeInfo.NewSize.Width) / 2;
}
Run Code Online (Sandbox Code Playgroud)


小智 0

您可以使用 TranslateTransform 来动画位置更改,而不是直接设置 Me.Top 和 Me.Left。

public static void MoveTo(this UIElement target, double newX, double newY)
{
    var top = Canvas.GetTop(target);
    var left = Canvas.GetLeft(target);
    TranslateTransform trans = new TranslateTransform();
    target.RenderTransform = trans;
    DoubleAnimation anim1 = new DoubleAnimation(top, newY - top, TimeSpan.FromSeconds(10));
    DoubleAnimation anim2 = new DoubleAnimation(left, newX - left, TimeSpan.FromSeconds(10));
    trans.BeginAnimation(TranslateTransform.XProperty,anim1);
    trans.BeginAnimation(TranslateTransform.YProperty,anim2);
}
Run Code Online (Sandbox Code Playgroud)

代码来源:WPF。以编程方式将图像移动到 (X,Y) 的最简单方法?