2013-05-09 10 views
8

Mam okno WPF, które zmienia jego rozmiar w czasie ze względu na SizeToContent = "WidthAndHeight". Początkowo WindowStartupLocation = „elektronów na środek” pokazuje okno prawidłowo wyśrodkowany, a potem ja wycentruje go:Zachowaj okno wyśrodkowane po SizeToContent płynnie

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 

Ale to wytwarza „skakać” jak okno jest zmieniany po pierwszym i skupione.

Czy istnieje sposób na sprawne wykonanie?

Odpowiedz

0

Zamiast ustawiać Me.Top i Me.Left bezpośrednio, możesz użyć funkcji TranslateTransform do zmiany pozycji animacji.

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

źródło Kod: WPF. Easiest way to move Image to (X,Y) programmatically?

+0

Nie głosowałem to w dół, bo technicznie to działa. Jednak nie jestem pewien, czy ktokolwiek chciałby animować okno o nowym rozmiarze, ponownie zmieniające położenie. Znacznie chłodniejszą rzeczą do animacji będzie zmiana rozmiaru z punktem początkowym 0,5, 0,5. Okno będzie cały czas wyśrodkowane i rozciągnie się w pożądanym rozmiarze. – Crono

2

Ten pracował dla mnie:

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; 
} 
Powiązane problemy