2009-03-03 7 views
42

Attualmente sto lavorando con Panel s in WPF e ho notato che per quanto riguarda le proprietà Width e Height, ci sono anche altre due proprietà chiamate ActualWidth e ActualHeight.Qual è la differenza tra Width e ActualWidth in WPF?

ActualWidth

Ottiene la larghezza di rendering di questo elemento . Questa è una proprietà di dipendenza . (Ereditato da FrameworkElement.)

Width

Ottiene o imposta la larghezza dell'elemento. Questa è una proprietà di dipendenza. (Ereditato da FrameworkElement.)

Riferimento: MSDN

Chiunque può segnalare le differenze tra i due e quando utilizzare uno dei due?

risposta

62

Width/Height è 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 resa. Se vuoi/hai bisogno delle dimensioni reali dell'articolo, usa questo attributo.

+7

In realtà la dimensione del layout non è la dimensione del rendering. – chuckj

+2

@chuckj, quale attributo si userebbe per ottenere le dimensioni del rendering? – dumbledad

+0

@dumbledad '.RenderSize.Width' – Mafii

3

ActualWidth è impostato dal sistema di rendering e può essere diverso a seconda delle larghezze degli altri elementi e dei vincoli di dimensione complessiva. Di conseguenza, non può essere modificato. Width è una proprietà che può essere modificata e deve essere utilizzata per aumentare o diminuire la larghezza dell'elemento.

Da MSDN:

Questa proprietà è un valore calcolato sulla base di altri fattori di larghezza, e il sistema di layout. Il valore è impostato dal sistema di layout stesso, in base a un passaggio di rendering effettivo e può pertanto essere leggermente inferiore rispetto al valore impostato di proprietà come Width che sono alla base della modifica dell'input.

0

È esattamente questo, la larghezza del rendering! = Larghezza del layout. Uno è destinato a essere utilizzato per il layout mentre l'altro è destinato al rendering. Come con WinForms, c'era una dimensione e una proprietà ClientSize, la differenza è leggermente diversa e dovresti usare la dimensione del rendering di Atual/Client e la larghezza/altezza per il layout.

0

È possibile impostare la proprietà Width, ma non la proprietà ActualWidth.

La proprietà Width viene utilizzata per determinare come viene eseguito il rendering del pannello, quindi ActualWidth è impostato sulla larghezza effettiva utilizzata. Questo potrebbe non essere lo stesso valore di Larghezza, a seconda della dimensione dei suoi elementi figli e delle costrizioni dal suo elemento genitore.

Il ActualWidth non viene impostato immediatamente quando si imposta la proprietà Width, ma verrà aggiornato (una o più volte) durante il rendering.

7

ActualWidth account per il riempimento del valore così ogni volta che è necessario conoscere quel numero è possibile chiamare Actualwidth invece di larghezza ed evitare il calcolo.

modifica: rimosso Margine b/c non fa parte di ActualWidth.

10

Trovo che lo ActualWidth sia 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 che contiene 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> 
3

C'è una buona ragione non utilizzare il ActualWidth a legarsi a (ovviamente ActualHeight di conseguenza). Quando si imposta Width di un elemento, su ActualWidth di un altro è possibile che interrompa la catena di layout.

Nel migliore dei casi l'elemento/controllo deve essere analizzato dopo il processo di layout del genitore (l'origine di associazione) terminato. Ciò significa più tempo. Se si trova allo stesso livello gerarchico del genitore, il processo di layout richiede due esecuzioni (almeno) per calcolare una dimensione definitiva.

Per esempio ho avuto un controllo che ha avuto è proprietà size sovrascritto in uno stile che vorrebbe mettere al TemplatedParent(non farlo):

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}" 
      Height="1" Fill="#000000"/> 

Quando il ridimensionamento della finestra che contiene, il controllo impedirebbe al contenitore di diventare più piccolo e frenare il layout. Impostazione al Width risolverà il problema (fare):

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}" 
      Height="1" Fill="#000000"/> 

Se si deve usare il ActualWidth in qualcosa di generale, è sbagliato con il vostro XAML. Meglio aggiustarlo invece di fare confusione con le dimensioni finali dell'esecuzione del layout.

+1

I frammenti di codice (" non fare "e" fare ") sono esattamente gli stessi?!?! – PIntag

+0

Grazie per il commento. Risolto il problema. – Pascal

+1

@tuner Non sono d'accordo con questo: "Se devi usare ActualWidth in generale qualcosa non va con il tuo xaml". Non c'è niente di sbagliato nel collegamento a "ActualWidth' (o" ActualHeight'), anzi in alcuni casi questo potrebbe essere il modo più semplice per risolvere un particolare problema di layout. Solo perché legarsi a queste proprietà causa problemi in (rare) occasioni non c'è motivo di evitarle completamente. –