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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top