2016-02-26 17 views
5

Ho un WrapPanel e i pulsanti vengono creati e aggiunti a livello di programmazione come figli del WrapPanel. Quindi, voglio mostrare la barra di scorrimento verticale quando WrapPanel è pieno di pulsanti (bambini) per poter aggiungere più pulsanti in modo continuo.Come rendere WrapPanel per mostrare la barra di scorrimento verticale quando i bambini sono pieni con o senza ScrollViewer

Se è necessaria una barra di scorrimento, è necessario portare ScrollViewer? Non c'è un modo senza ScrollViewer? Quello che voglio ottenere è che, poiché WrapPanel è di piccole dimensioni, voglio che una barra di scorrimento sia mostrata solo quando serve (come piena di bambini).

Il mio codice è semplice, come di seguito (WrapPanel all'interno Grid e la griglia si trova all'interno TabControl)

Grazie sempre per la vostra eccellenza.

Aggiornamento: Ho faticato a trovare soluzioni su Internet anche per diversi giorni. E ho provato a mettere WrapPanel all'interno di ScrollViewer. Tuttavia, sebbene abbia impostato VerticalScroll su Auto, la barra di scorrimento verticale viene sempre visualizzata anche quando WrapPanel non ha figli.

Inoltre, quando creo intenzionalmente WrapPanel di pulsanti (pulsanti), la barra di scorrimento verticale di ScrollViewer non fornisce la disponibilità di scorrimento. E i pulsanti nella riga inferiore di WrapPanel mostrati tagliati e altro, non riesco a scorrere verso il basso per vedere oltre il pulsante nella riga inferiore. Ho fatto in modo che i pulsanti venissero posizionati oltre la linea di fondo di WrapPanel intenzionalmente.

Con o senza, voglio che la barra di scorrimento verticale venga visualizzata quando è solo necessaria (piena di bambini). Sembra molto facile da fare. Ma è difficile farlo funzionare correttamente.

Soluzione: è stato fornito da Sig Henk Holterman

    <DropShadowEffect/> 
       </Button.Effect> 
      </Button> 
      <WrapPanel x:Name="WrapPanelGreen" HorizontalAlignment="Left" Height="180" VerticalAlignment="Top" Width="232" UseLayoutRounding="True" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"/> 
     </Grid> 
    </TabItem> 
</TabControl> 

E sotto è il mio semplice codice che fa il tasto di programmazione e aggiungere come figlio di WrapPanel.

for (int k = 0; k < Overviews.Length; k++) 
{ 
    Button btnoverviewcontent = new Button(); 

    ToolTip tt = new ToolTip(); 
    tt.Content = "Press this button if you want to modify or delete."; 
    btnoverviewcontent.ToolTip = tt; 

    btnoverviewcontent.Cursor = Cursors.Hand; 

    SolidColorBrush mySolidColorBrush = new SolidColorBrush(); 
    mySolidColorBrush.Color = Color.FromArgb(255, 101, 173, 241); 
    btnoverviewcontent.Background = mySolidColorBrush; 

    btnoverviewcontent.Effect = new DropShadowEffect 
    { 
     Color = new Color { A = 255, R = 0, G = 0, B = 0 }, 
     Direction = 315, 
     ShadowDepth = 5, 
     Opacity = 1 
    }; 

    btnoverviewcontent.Padding = new Thickness(3, 3, 3, 3); 
    btnoverviewcontent.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch; 
    TextBlock textBlock = new TextBlock() 
    { 
     Text = Overviews[k], 
     TextAlignment = TextAlignment.Left, 
     TextWrapping = TextWrapping.Wrap, 

    }; 

    btnoverviewcontent.Content = textBlock; 
    btnoverviewcontent.BorderThickness = new Thickness(0, 0, 0, 0); 
    btnoverviewcontent.FontStretch = FontStretches.UltraExpanded; 
    btnoverviewcontent.Margin = new Thickness(5, 5, 5, 5); 

    WrapPanelGreen.Children.Add(btnoverviewcontent); 
    btnoverviewcontent.Click += new RoutedEventHandler(OnOverviewClick); 
+0

vorrei indirizzarvi a: http://stackoverflow.com/a/2119243/1723823 È una buona ripartizione della funzione di base di WrapPanel con alcuni commenti su come implementare lo scorrimento con esso. – TernaryTopiary

+0

@HenkHolterman, per favore vedi la mia domanda aggiornata. Grazie per il tuo prezioso commento. –

+0

@TernaryTopiary, molte grazie per la vostra direzione. Tuttavia, ho anche valutato di nuovo la pagina collegata e in questo momento completamente. Il mio problema è che i bambini (pulsante) sono programmati e le dimensioni dei bambini sono diverse a seconda del loro contenuto testuale. Pertanto, non posso adottare la seconda soluzione. Per favore, vedi la mia domanda aggiornata. –

risposta

10

L'idea in WPF è che ogni componente ha solo il proprio lavoro e se si vuole certo comportamento, si combinano più componenti per creare la vista che si sta cercando.

Ciò significa che per ottenere una barra di scorrimento per un pannello, è necessario avvolgerlo in un componente ScrollViewer. Questo è lo scopo dello ScrollViewer e questa è l'unica (sana) soluzione per risolvere questo problema.


Tuttavia, se ho impostato il verticalscroll su auto, il verticalScrollBar è sempre dimostrato anche quando la WrapPanel non ha nessun bambino [...]

Poi ti sembra di essere con il ScrollViewer in modo errato o avvolgendo l'elemento sbagliato. Esso dovrebbe essere simile a questo:

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
    <WrapPanel> 
     <!-- Any number of components here --> 
    </WrapPanel> 
</ScrollViewer> 

Se metto un sacco di esempi di etichette all'interno che, quindi io capisco una barra di scorrimento, non appena la finestra non è abbastanza grande per mostrare loro tutto. Ma se c'è spazio sufficiente, la barra di scorrimento non viene visualizzata.

Si noti che lo stesso ScrollViewer deve avere le dimensioni corrette nell'elemento padre, quindi assicurarsi che non sia più grande dell'area visibile. È inoltre necessario che lo WrapPanel (o qualsiasi altro elemento che si avvolge con lo ScrollViewer) abbia larghezza e altezze automatiche. Altrimenti, con dimensioni fisse, le dimensioni del pannello non cambieranno quando si modifica il contenuto del pannello e pertanto lo stato di scorrimento non cambierà.


vedere questo esempio completo di una serie dinamica di elementi:

<Window x:Class="WpfExampleApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="300" Width="200"> 
    <ScrollViewer VerticalScrollBarVisibility="Auto"> 
     <WrapPanel Name="panel"> 
      <Button Click="Button_Click">Add child</Button> 
     </WrapPanel> 
    </ScrollViewer> 
</Window> 

Codice-behind:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Label element = new Label() { Content = "This is some example content" }; 
     panel.Children.Add(element); 
    } 
} 
+0

Stavo per sottolineare che WrapPanel ha già un componente ScrollViewer, ma ho avuto un gioco in Visual Studio ed è giunto alla conclusione che anche se lo forzate a mostrare il visualizzatore scroll tutto il tempo (tramite WrapPanel's Tag XAML: 'ScrollViewer.VerticalScrollBarVisibility =" Visible "', in realtà non offre lo scrolling per l'utente finale.Io sono d'accordo con questa risposta – TernaryTopiary

+1

@TernaryTopiary La proprietà allegata 'ScrollViewer.VerticalScrollBarVisibility' può essere associata a ogni componente ma ha solo un effetto per i controlli che hanno effettivamente una barra di scorrimento (ad esempio 'ListView's.) I pannelli in generale non includono alcuna funzionalità di scorrimento ma offrono solo le varie funzionalità di layout in modo che debbano sempre essere racchiusi in un' ScrollViewer'. – poke

+0

@poke, apprezzo molto la tua preziosa risposta, ho anche cercato di avvolgere come il tuo suggerimento, ma come ho aggiornato, i bambini sono fatti programmaticamente e impostare come un bambino di Wrappanel. È diverso dal tuo suggerimento? La mia barra di scorrimento mostra anche quando non è necessaria e non funziona quando è necessario..Oh..God..Ho provato a trovare la soluzione per diversi giorni e infine a chiedere allo stackoverflow ... –

Problemi correlati