【问题标题】:Keep window centered after SizeToContent smoothly在 SizeToContent 之后保持窗口平稳居中
【发布时间】:2013-05-03 14:00:56
【问题描述】:

我有一个 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

但是当窗口首先调整大小并居中时,它会产生“跳跃”。

有什么方法可以顺利完成吗?

【问题讨论】:

    标签: wpf center sizetocontent


    【解决方案1】:

    您可以使用 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);
    }
    

    代码来源:WPF. Easiest way to move Image to (X,Y) programmatically?

    【讨论】:

    • 我没有投反对票,因为从技术上讲它是有效的。但是,我不确定是否有人想要动画一个新调整大小的窗口重新居中。动画更酷的事情是使用 0.5、0.5 的原点调整大小。窗口将始终保持居中,并且跨越所需的大小。
    【解决方案2】:

    这对我有用:

    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;
    }
    

    【讨论】:

      【解决方案3】:

      感谢您发布此信息。我的情况是我有一个对话框窗口,当 ViewModel 加载指定它的高度和宽度时,它调整了大小。我使用了您的示例,但对其进行了一些修改以捕获所有者窗口,然后我重新定位。

      protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
      {
          base.OnRenderSizeChanged(sizeInfo);
      
          //Calculate half of the owner to move the form
          Window owner = Owner as Window;
      
          this.Top = (owner.Height / 2) - (this.Height / 2);
          this.Left = (owner.Width / 2) - (this.Width / 2);
      }
      

      【讨论】:

        【解决方案4】:
        private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
            {
                if (e.HeightChanged)
                    Top += (e.PreviousSize.Height - e.NewSize.Height) / 2;
                if (e.WidthChanged)
                    Left += (e.PreviousSize.Width - e.NewSize.Width) / 2;
            }
        

        【讨论】:

        • 您能进一步解释一下吗?那个代码有什么作用?是什么让您认为它解决了最初的问题?
        • 此代码用于在每次调整窗口大小时使窗口居中。
        猜你喜欢
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多