2013-05-09 9 views
8

SizeToContent = "WidthAndHeight" nedeniyle zaman içinde boyutunu değiştiren bir WPF penceresi var. Başlangıçta WindowStartupLocation = "CenterScreen" doğru merkezli pencereyi gösterir ve bundan sonra ben onu recenter:SizeToContent sorunsuz bir şekilde pencere ortalamasını düzgün tutun

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 

Ama pencere ilk boyutlandırılır ve sonra merkezli gibi bir "atlama" üretir.

Sorunsuz bir şekilde yapmanın bir yolu var mı?

cevap

0

Me.Top ve Me.Left'i doğrudan ayarlamak yerine, konum değişikliğini hareketlendirmek için bir TranslateTransform kullanabilirsiniz.

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

Kod kaynağı: WPF. Easiest way to move Image to (X,Y) programmatically?

+0

Bunu aşağı oy vermedi. Ancak, yeniden düzenlenmiş bir pencerenin kendisini yeniden merkezlendirmek isteyen herkesin emin olmasını istemiyorum. Animasyon için çok daha havalı bir şey 0.5, 0.5'lik bir başlangıç ​​noktası ile yeniden boyutlandırılacaktır. Pencere her zaman ortalanmaya devam edecek ve sadece istenilen büyüklükte olacak. – Crono

2

Bu benim için çalıştı: Teknik olarak çalıştığı için

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; 
} 
İlgili konular