2009-07-16 2 views
5

ho questo pezzo di codice XAML:WPF controllo dimensione effettiva

<Window x:Class="SizingTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Label x:Name="theLabel" Width="Auto">A very large label with a lot of text</Label> 
    </Grid> 
</Window> 

nel codice dietro, sto cercando di ottenere la larghezza effettiva del marchio, ho pensato

theLabel.ActualWidth 

avrebbe fatto il trucco, ma dopo aver provato questo codice:

public Window1() 
{ 
    InitializeComponent(); 
    double width = theLabel.ActualWidth; 
} 

Il valore della larghezza è 0, ho anche controllato con theLabel.Width, che restituisce NaN, theLabel.Desir edSize.Width, che restituisce anche 0. Cosa posso usare per trovare la larghezza reale dell'etichetta?

Grazie.

+3

Potrebbe essere che il controllo non abbia ActualWidth perché sei ancora nel costruttore? Windows non è ancora stato ancora reso. Cosa succede se si sposta quel codice per, ad esempio, il gestore di eventi Loaded? –

+0

Ha! Questo è stato. Ho sempre pensato dopo InitializeComponent() tutto dovrebbe essere già reso ... grazie! – Carlo

risposta

12

ActualWidth non è impostato fino a quando i genitori del componente (e possibili figli) sono disposti.

Per ottenere il ActualWidth di un componente, è necessario attendere il completamento di un passaggio di layout. Ascolta l'evento Loaded, poiché non viene chiamato fino a dopo il primo passaggio di layout.

+1

dopo aver cercato una soluzione per 45 minuti, questo finalmente funziona>.> Grazie! (2 anni dopo: P) – Toadums

+0

Grazie, stavano impazzendo per questo :) – robertk