Perché in questo caso ActualWidth e ActualHeight 0.0?

Ho una Grid all’interno di una Canvas definita in questo modo:

                  

Il mio problema è che, nel costruttore Window, dopo InitializeComponents() Grid.ColumnDefinitions[0].ActualWidth o “qualsiasi rettangolo”. ActualWidth sono tutti impostati su 0.0 (lo stesso per le altezze). Non sto cercando di capire cosa fare per ottenere queste informazioni. Qualsiasi aiuto?

osservazioni:

  1. Non sto definendo la larghezza e l’altezza della canvas esterna, ma se lo faccio, non risolve il mio problema.
  2. In fase di esecuzione posso vedere che questo Canvas/Grid occupa l’intero spazio della finestra, quindi ogni rettangolo al suo interno ha ActualWidth s e ActualHeight s
  3. La larghezza / altezza della griglia è legata alla canvas ma ho provato a rimuovere questa associazione e il mio problema persiste ancora.

ActualHeight e ActualWidth non sono impostati finché il controllo non viene misurato e organizzato. Di solito non c’è nulla in InitializeComponent() che causa una misura, quindi quando restituisce questi sarà ancora zero.

È ansible forzare questi in modo che vengano calcolati in precedenza semplicemente chiamando manualmente i metodi Measure() e Arrange() della finestra dopo il ritorno di InitializeComponent() della finestra.

Se stai ridimensionando il contenuto:

 window.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height)); 

Se stai usando una dimensione di finestra esplicita:

 window.Measure(new Size(Width, Height)); window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height)); 

Ray ha ragione (+1) che ciò è dovuto al fatto che la misura e l’arrangiamento non sono ancora stati eseguiti. Tuttavia, piuttosto che forzare un altro passaggio di layout (costoso), è sufficiente attendere il caricamento del controllo prima di accedere alle proprietà di ActualXxx :

 public MyWindow() { Loaded += delegate { // access ActualWidth and ActualHeight here }; } 

Nel nostro caso la soluzione era semplice, poiché tutti dicevano che ActualWidth e ActualHeight necessitavano di essere richiamati dopo il completamento del Loaded, quindi abbiamo appena inserito il codice in un dispatcher e impostato la priorità su Loaded come di seguito:

 Dispatcher.Invoke(new Action(() => { graphHeight = ActualHeight; graphWidth = ActualWidth; }), DispatcherPriority.Loaded); 

ActualWidth e ActualHeight sono disponibili solo dopo aver completato il caricamento XAML, prima di caricare come è ansible trovare questi parametri?

Utilizzare l’evento Loaded e al suo interno trovare ActualWidth e ActualHeight .

 private void me_Loaded(object sender, RoutedEventArgs e) { // do your stuffs here. }