2009-12-30 13 views
18

Ho uno TextBlock all'interno di uno ScrollViewer allineato con tratto alla sua finestra. Ho bisogno del TextBlock a comportarsi come i seguenti:C# WPF - ScrollViewer + Problemi di TextBlock

  • Ridimensiona con finestra, senza barre di scorrimento
  • Quando ridimensionata di sotto di una certa larghezza le TextBlock ha bisogno di mantenere un MinWidth e barre di scorrimento dovrebbe apparire
  • TextWrapping o TextTrimming dovrebbe funzionare appropriatamente

Come posso ottenere questa funzionalità?

Ho provato diversi modi, coinvolgendo associazioni per ActualWidth & ActualHeight, ma non riesco a farlo funzionare.

Questo non può essere così difficile, cosa mi manca?

Ecco un esempio di codice per mettere in XAMLPad (senza MinWidth è ancora impostata):

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
      <TextBlock TextWrapping="Wrap" Text="Some really long text that should probably wordwrap when you resize the window." /> 
    </ScrollViewer> 
</Window> 
+0

Chiarimento: lo scrollviewer è incorporato nel modello del controllo? O è esterno al controllo? –

+0

Puoi far finta che assomigli a quanto sopra. – jonathanpeppers

risposta

23

Questo funziona:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Name="Scroller"> 
      <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="100" Width="{Binding ElementName=Scroller, Path=ViewportWidth}" 
      TextWrapping="Wrap" Text="Some really long text that should probably wordwrap when you resize the window." /> 
    </ScrollViewer> 
</Window> 
+1

Sì, è un modo, anche se può causare il looping del motore di impaginazione più volte sulla struttura visiva perché il bind di larghezza avviene dopo il rendering, che costringe un altro passaggio di layout. –

+1

C'è un altro modo? – jonathanpeppers

+0

Sì il modo corretto sarebbe quello di modificare la misura e organizzare la logica sia per lo spettatore di scorrimento, il blocco di testo, o qualche elemento personalizzato in mezzo. Mi sta distruggendo il cervello cercando di capirlo da quando ho scritto quel commento 'Ci sto lavorando' :) –

2

Senza più in dettaglio, il meglio che posso fare è fornire il modo standard di fare questo. Fondamentalmente, host il tuo elemento (che ha una dimensione minima) in un visualizzatore di scorrimento; quando lo scrollviewer viene ridimensionato abbastanza piccolo in modo che l'elemento non possa integrarsi completamente all'interno, visualizzerà automaticamente le barre di scorrimento. Esempio:

<ScrollViewer> 
    <Button MinWidth="100" MinHeight="50"/> 
</ScrollViewer> 
+0

Hmm, questo funziona in XamlPad, ma non nella mia applicazione. Dovrò fare qualche ricerca per capire perché. – jonathanpeppers

+0

È perché il mio controllo è un TextBlock. Vedi la mia modifica sopra. – jonathanpeppers

+0

Qual è esattamente il comportamento che stai cercando di ottenere? Dovrebbe funzionare quando si impostano 'MinWidth' e' MinHeight' anche su 'TextBlock'. –

Problemi correlati