2010-06-24 22 views
5

da this question, ho eseguito il drill down del problema su una listbox, che non viene ridimensionata, quando gli oggetti Listbox si restringono. Si ridimensiona di conseguenza, quando la dimensione degli elementi aumenta, ma non si riduce, quando diminuisce la dimensione degli elementi.Silverlight 4: Listbox non si restringe quando i suoi articoli si restringono

Gli elementi possono aumentare o diminuire perché gli elementi contenenti caselle di testo, che vengono ridimensionate con l'input.

Geremia suggerito di iniziare una nuova domanda con più codice per mostrare, così qui andiamo:

La nostra casella di riepilogo il male è parte di un controllo utente, che contiene uno StackPanel con un'etichetta (HorizontalAlignment = Center), la casella di riepilogo (HA = sinistra) e un pulsante (HA = destra). Le voci della lista sono collegate a una ObservableCollection

Riconoscerete i bellissimi BackgroundColors sul ListBox e sui ListBoxItems. Li ho usati per essere in grado di dire che gli Articoli o la Listbox stessa non si restringono. Ho scoperto che gli articoli si restringono, ma la lista non lo fa.

Ok, ecco il codice della mia UserControl:

<StackPanel VerticalAlignment="Top" HorizontalAlignment="Left"> 
    <StackPanel.Background> 
    <SolidColorBrush Color="{StaticResource ColorBasicDark}"/> 
    </StackPanel.Background> 

    <sdk:Label x:Name="LabelServiceName" FontSize="{StaticResource FontSizeMedium}" Margin="2" HorizontalAlignment="Center" Content="LabelServiceName"> 
    <sdk:Label.Foreground> 
     <SolidColorBrush Color="{StaticResource ColorBasicLight}"/> 
    </sdk:Label.Foreground> 
    </sdk:Label> 

    <ListBox x:Name="ListBoxCharacteristics" BorderBrush="{x:Null}" Margin="0" HorizontalContentAlignment="Left" FontSize="9.333" HorizontalAlignment="Left"> 
    <ListBox.Foreground> 
     <SolidColorBrush Color="{StaticResource ColorBasicLight}"/> 
    </ListBox.Foreground> 

    <!-- DataTemplate to display the content --> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel x:Name="StackPanelBorder" Orientation="Horizontal" HorizontalAlignment="Left"> 
      <TextBox x:Name="TextBoxCharacteristicName" Style="{StaticResource InputTextBox}" Text="{Binding Name}" /> 
      <TextBox x:Name="TextBoxSep" Style="{StaticResource ReadOnlyTextBox}" Text="=" /> 
      <TextBox x:Name="TextBoxFuncOrValue" Style="{StaticResource InputTextBox}" Text="{Binding Value.Text}" /> 
      <TextBox x:Name="TextBoxValue" Style="{StaticResource ReadOnlyTextBox}" /> 
      <Button x:Name="ButtonRemove" Style="{StaticResource BasicButtonStyle}" Content="-" Click="ButtonRemove_Click" /> 
     </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 

    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
     <Setter Property="HorizontalAlignment" Value="Left" /> 
     <Setter Property="Background" Value="Yellow" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 

    <ListBox.Background> 
     <SolidColorBrush Color="Red" /> 
    </ListBox.Background> 
    </ListBox> 

    <Button x:Name="ButtonAddCharaDisplayObject" Style="{StaticResource BasicButtonStyle}" Content="+" HorizontalAlignment="Right" Click="ButtonAddCharaDisplayObject_Click" /> 
</StackPanel> 

Non ho idea del perché la casella di riepilogo non si restringe quando la dimensione degli elementi ridursi, anche se ho impostato la' dimensione casella di riepilogo per Auto e HorizontalAlignment a sinistra

Grazie in anticipo, Frank

risposta

5

ho finalmente trovato la soluzione in this post. Il problema è che da Silverlight 3 in poi, ListBox utilizza VirtualizationStackPanel per visualizzare ListItems. Oltre a StackPanel, VirtualizationStackPanel utilizza tutto lo spazio che ottiene e non restituisce mai lo. Quindi, quando l'elemento più grande del tuo elenco si restringe e quindi lo stesso ListBox potrebbe ridursi perché ora c'è spazio inutilizzato, la larghezza (e l'altezza) del ListBox rimarrà invariata a causa di VirtualizationStackPanel che non si restringe correttamente.

Per risolvere questo problema, possiamo forzare ListBox a utilizzare StackPanel anziché VirtualizationStackPanel. Si noti che ciò può avvenire a scapito delle prestazioni!

<ListBox HorizontalContentAlignment="Left" FontSize="9.333" HorizontalAlignment="Left"> 

    ... // other listbox related stuff 

    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 

</ListBox> 
+0

Grazie per aver dedicato del tempo per pubblicare questa soluzione alla propria domanda. Stavo avendo lo stesso problema e questo ha funzionato alla grande! –

0

Beh ... io non ho tutto il codice. Ma ho semplificato ciò che avevi sopra e funziona.

Spero che questo ti aiuti, in qualche modo, a capire il tuo problema. Ancora una volta, potrebbe essere il genitore di questo controllo a causare i problemi. Potrebbe anche essere uno dei tuoi stili che stai applicando. Prova a togliere TUTTO il tuo controllo che non deve essere lì, quindi aggiungilo lentamente per trovare il colpevole.

Ho creato una nuova applicazione Silverlight, e questa è letteralmente l'unica cosa in esso. La listbox cresce e si restringe come previsto.

XAML:

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    x:Class="Test.MainPage"> 

    <Grid x:Name="LayoutRoot"> 
     <StackPanel VerticalAlignment="Top" HorizontalAlignment="Left"> 
      <StackPanel.Background> 
      <SolidColorBrush Color="Black"/> 
      </StackPanel.Background> 

      <ListBox x:Name="ListBox" BorderBrush="{x:Null}" Margin="0" HorizontalContentAlignment="Left" FontSize="9.333" HorizontalAlignment="Left"> 
      <ListBox.Foreground> 
       <SolidColorBrush Color="Silver"/> 
      </ListBox.Foreground> 

      <!-- DataTemplate to display the content --> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
       <StackPanelOrientation="Horizontal" HorizontalAlignment="Left"> 
        <TextBox FontSize="30" Text="{Binding}" />  
       </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

      <ListBox.ItemContainerStyle> 
       <Style TargetType="ListBoxItem"> 
       <Setter Property="HorizontalAlignment" Value="Left" /> 
       <Setter Property="Background" Value="Yellow" /> 
       </Style> 
      </ListBox.ItemContainerStyle> 

      <ListBox.Background> 
       <SolidColorBrush Color="Red" /> 
      </ListBox.Background> 

      </ListBox> 

      <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Height="30"> 
       <Button Content="Add" Click="Add_Click" Width="100"/> 
       <Button Content="Remove" Click="Remove_Click" Width="100"/> 
      </StackPanel> 
     </StackPanel>  
    </Grid> 
</UserControl> 

Codice Dietro:

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace Test 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      // Required to initialize variables 
      InitializeComponent(); 

      Count = 8; 
     } 

     private int Count; 

     private void Add_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 
      Count = Count * 8; 

      ListBox.Items.Add("Hi Mom (" + Count.ToString() + ")"); 
     } 

     private void Remove_Click(object sender, System.Windows.RoutedEventArgs e) 
     { 
      ListBox.Items.RemoveAt(ListBox.Items.Count-1); 
     } 
    } 
} 
+0

Non ho ancora risolto il problema, ma poiché non è una priorità assoluta, è in attesa fino a quando non vengono implementate altre funzionalità.Una cosa che pensavo avrebbe potuto causare, era che il genitore dell'UC era una tela, ma quando lo metti in una Griglia, il problema rimane lo stesso. Se lo farò in qualche modo, riferirò. – Aaginor

+0

Avendo di nuovo questo problema sul mio tavolo, ho trovato che il ListBox non si restringe, quando cambia la dimensione di un elemento ma quando cambia l'elenco degli elementi (e la listbox probabilmente rende nuovamente il contenuto). Ma quando si modifica la dimensione della riga più grande eliminando il testo, la dimensione della casella di riepilogo si riduce SOLO, quando un elemento viene aggiunto (o rimosso) – Aaginor

Problemi correlati