2009-02-06 14 views
5

Ho scritto un controllo utente WPF e parte di esso comporta l'aggiunta dinamica di elementi a una tela che effettua l'altezza di detta tela. La tela è nidificata all'interno di una griglia. Quando aggiungo dinamicamente i miei elementi, l'altezza della tela cambia, ma la tela finisce per estendersi oltre il bordo del controllo generale piuttosto che causare il ridimensionamento del controllo e rendersi più alto. Come posso forzare il ridimensionamento del controllo correttamente? Ho la sensazione che ho bisogno di chiamare o sovrascrivere Measure o Arrange ma non ho fortuna con entrambi i metodi - forse perché li chiamo con parametri errati o forse perché non sono i metodi corretti per chiamare.Forzare un controllo WPF personalizzato per ridimensionare correttamente

+0

Stai utilizzando Blend? –

+0

Sono arrivato a questa domanda perché anch'io sono * dinamicamente * aggiungendo elementi a un controllo e non si sta ridimensionando anche se ho sovrascritto MeasureOverride (che funziona). Il problema consiste nel forzare un riorganizzazione degli elementi dell'interfaccia utente interessati a ogni nuovo elemento aggiunto in modo che si spostino per accogliere la crescita. –

+0

Ho risolto il mio problema, e sembra che l'evento ItemsChanged abbia effettivamente invalidato il layout e imposto un aggiornamento. Giustamente spiega che l'implementazione di un MeasureOverride personalizzato funzionerà. –

risposta

1

È necessario sostituire il metodo MeasureOverride del controllo e restituire la dimensione desiderata (la dimensione della tela) da lì. Quindi il controllo genitore si ridimensionerebbe per adattarsi al figlio (se possibile).

16

Il tuo problema è che i pannelli Canvas non vengono ridimensionati per adattarsi al loro contenuto.

Si è fatto riferimento a Misura e disposizione. Conosce il sistema di layout a due passaggi di WPF? Leggi questo articolo per ulteriori informazioni: WPF's Layout System.

Questo articolo descrive anche quali pannelli diversi fanno per il layout. Ogni tipo di pannello è diverso.

In WPF, agli elementi viene innanzitutto data l'opportunità di determinare quale dimensione saranno. I pannelli possono determinare le loro dimensioni in base alle dimensioni dei loro figli, oppure possono chiedere dimensioni fisse indipendentemente dalle dimensioni dei loro figli. Canvas è un esempio di quest'ultimo.

Gli elementi vengono successivamente indicati di quali dimensioni saranno e hanno chiesto di organizzare se stessi ei loro figli.

Il tipo di pannello Grid non solo consente righe e colonne, ma è anche molto utile per ridimensionare automaticamente il contenuto.

Il tipo di StackPanel non si dimensiona automaticamente nella dimensione in cui è orientato, ma si autosize nell'altra dimensione.

La tela può ridimensionare automaticamente uno spazio, ma non consente mai ai bambini di ridimensionare automaticamente. Disegna i suoi figli alle coordinate specificate e non si cura di quanto siano grandi.

Suggerirei di provare una griglia con solo una riga/colonna.

Oppure è possibile creare una nuova classe Canvas con funzionalità di autosizing migliori. Durante la misura, vorresti misurare gli elementi del bambino e dimensionare la tua tela di conseguenza. Potresti trovare una classe come questa in fondo alla strada.

Ecco un articolo su Auto Layout in WPF.

Se si desidera creare un pannello personalizzato, ecco un argomento secondario: Custom Panel Elements.

MODIFICA: Un'ultima cosa: puoi anche associare la larghezza/altezza dell'elemento figlio alle proprietà ActualWidth e ActualHeight sull'area di disegno in modo che il bambino possa regolare le dimensioni del suo elemento principale. È possibile utilizzare un convertitore per impostare un rapporto dimensioni, se necessario.

0

È possibile utilizzare un UniFormGrid per archiviare questo.Impostare colonne o riga uguale a 1 in modo che si può ottenere un elementi verticali/orizzontali disposti

<UniformGrid Columns="1"> 
    <Button Content="Content 1"/> 
    <Button Content="Content 2"/> 
    <Button Content="Content 3"/> 
</UniformGrid> 
2

hai cercato di avvolgere tutto (il contenuto del controllo personalizzato) in una Viewbox? ad es.

<UserControl> 
    <Border BorderBrush="Black" BorderThickness="1"> 
     <Viewbox> 
      <Grid> 
       <TextBlock Name="txtDefault" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" Foreground="Black" Opacity="0.5" Text="Default" /> 
       <TextBlock Name="txtValue" FontSize="16" Foreground="Black" Visibility="Collapsed" /> 
       <TextBlock Name="txtKey" Grid.Column="1" FontSize="18" Foreground="Black" Visibility="Collapsed" /> 
      </Grid> 
     </Viewbox> 
    </Border> 
</UserControl> 
Problemi correlati