2013-05-09 14 views
8

Ho una finestra WPF che modifica le sue dimensioni nel tempo a causa di SizeToContent = "WidthAndHeight". Inizialmente il WindowStartupLocation = "CenterScreen" mostra la finestra centrato correttamente, e dopo che ho recenter con:Mantieni centrata la finestra dopo SizeToContent

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 

ma produce un "salto", come la finestra viene ridimensionata prima e dopo centrato.

C'è un modo per farlo senza intoppi?

risposta

0

Invece di impostare Me.Top e Me.Left direttamente è possibile utilizzare un TranslateTransform per animare il cambio di posizione.

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

Codice sorgente: WPF. Easiest way to move Image to (X,Y) programmatically?

+0

non ho votato questo giù perché tecnicamente funziona. Tuttavia, non sono sicuro che qualcuno vorrebbe animare una finestra ridimensionata di recente ridistribuendo se stessa. Una cosa molto più interessante da animare sarebbe ridimensionare con un punto di origine di 0,5, 0,5. La finestra continuava a essere centrata in ogni momento e si estendeva attraverso la dimensione desiderata. – Crono

2

questo ha funzionato per me:

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