Qual è la differenza tra Width e ActualWidth in WPF?
-
03-07-2019 - |
Domanda
Attualmente sto lavorando con Panel
in WPF e ho notato che per quanto riguarda le proprietà Width
e Height
, ci sono anche due altre proprietà chiamate ActualWidth
e ActualHeight
.
ActualWidth
Ottiene la larghezza di rendering di questo elemento. Questa è una dipendenza proprietà. (Ereditato da FrameworkElement.)
Larghezza
Ottiene o imposta la larghezza dell'elemento. Questa è una proprietà di dipendenza. (Ereditato da FrameworkElement.)
Riferimento: MSDN
Qualcuno può indicare le differenze tra i due e quando usare uno dei due?
Soluzione
Larghezza
/ Altezza
è la dimensione richiesta o layout . Se si imposta su Auto, il valore è double.NaN
quando si accede alla proprietà nel codice sottostante.
ActualWidth
/ ActualHeight
è la dimensione renderizzata . Se desideri / hai bisogno della dimensione effettiva dell'articolo, usa questo attributo.
Altri suggerimenti
Trovo ActualWidth
più utile quando voglio associare la larghezza o l'altezza di un elemento a un altro.
In questo semplice esempio ho due pulsanti disposti uno accanto all'altro e un commento sotto che è vincolato alla larghezza dello StackPanel contenente i due pulsanti.
<StackPanel>
<StackPanel Margin="0,12,0,0" Orientation="Horizontal" Name="buttonPanel" HorizontalAlignment="Left" >
<Button Content="Yes - Arm the missile" FontWeight="Bold" HorizontalAlignment="Left"/>
<Button Content="No - Save the world" HorizontalAlignment="Left" Margin="7,0,0,0"/>
</StackPanel>
<TextBlock Text="Please choose whether you want to arm the missile and kill everybody, or save the world by deactivating the missile."
Width="{Binding Path=ActualWidth,ElementName=buttonPanel}" Margin="0,5,0,0" HorizontalAlignment="Left" TextWrapping="Wrap"/>
</StackPanel>
ActualWidth
tiene conto del riempimento del valore, quindi ogni volta che devi conoscere quel numero puoi chiamare Actualwidth
invece di larghezza ed evitare il calcolo.
modifica: rimosso il margine b / c non fa parte di ActualWidth.
ActualWidth
è impostato dal sistema di rendering e può essere diverso a seconda della larghezza di altri elementi e dei vincoli di dimensione generali. Di conseguenza, non può essere modificato. Width
è una proprietà che può essere modificata e deve essere utilizzata per aumentare o ridurre la larghezza dell'elemento.
Da MSDN :
Questa proprietà è un valore calcolato basato su altri input di larghezza e sul sistema di layout. Il valore è impostato dal sistema di layout stesso, basato su un passaggio di rendering effettivo, e pertanto potrebbe essere leggermente in ritardo rispetto al valore impostato di proprietà come
Width
che sono alla base della modifica dell'input.
Esiste un'ottima ragione per non utilizzare ActualWidth
per collegarsi (ovviamente ActualHeight
di conseguenza).
Quando imposti Width
di un elemento, su ActualWidth
di un altro puoi interrompere la catena di layout .
Nel migliore dei casi il tuo elemento / controllo deve essere analizzato al termine del processo di layout del genitore (l'origine dell'associazione). Ciò significa tempo aggiuntivo. Se si trova allo stesso livello gerarchico del genitore, il processo di layout richiede almeno due esecuzioni per calcolare una dimensione definitiva.
Ad esempio avevo un controllo che aveva la proprietà size sostituita in uno stile che lo avrebbe impostato su TemplatedParent
(non farlo) :
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}"
Height="1" Fill="#000000"/>
Quando si ridimensiona la finestra di contenimento, il controllo impedisce al contenitore di ridursi e di frenare il layout. Impostandolo su Width
risolverà il problema (do) :
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}"
Height="1" Fill="#000000"/>
Se devi usare ActualWidth
in generale qualcosa non va nel tuo xaml. Meglio risolverlo invece di rovinare le dimensioni finali del layout eseguito.
È esattamente questo, la larghezza di rendering! = larghezza del layout. Uno è destinato all'uso per il layout, l'altro è destinato al rendering. Come con WinForms, c'erano una dimensione e una proprietà ClientSize, le differenze leggermente e dovresti usare le dimensioni di rendering di Alual / Client e Larghezza / Altezza per il layout.
Puoi impostare la proprietà Width
, ma non la proprietà ActualWidth
.
La proprietà Width
viene utilizzata per determinare la modalità di rendering del pannello, quindi ActualWidth
viene impostato sulla larghezza effettiva utilizzata. Questo potrebbe non essere lo stesso valore di Larghezza, a seconda della dimensione degli elementi figlio e delle costrizioni dall'elemento padre.
ActualWidth
non viene impostato immediatamente quando si imposta la proprietà Width
, ma verrà aggiornato (una o più volte) durante il rendering.