2010-06-24 39 views
5

this question,我將這個問題深入到一個列表框,當Listbox-Items縮小時它不會調整大小。當物品的尺寸增加時,它會相應調整大小,但當物品尺寸減小時它不會縮小。Silverlight 4:當Listbox的項目收縮時,ListBox不收縮

項目可以增長/縮小,因爲包含文本框的項目會隨着輸入而調整大小。

耶利米建議開始與更多的代碼來顯示一個新的問題,所以在這裏我們去:

我們的邪惡列表框是一個用戶控件的一部分,它包含一個StackPanel用一個標籤(的Horizo​​ntalAlignment =中心),列表框(HA =左)和一個按鈕(HA =右)。列表框項目數據鏈接到ObservableCollection

您將在ListBox和ListBoxItems上識別出美麗的BackgroundColors。我用它們能夠分辨出項目或列表框本身沒有收縮。我發現,項目收縮,但列表框沒有。

好吧,這裏是我的用戶的代碼:

<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> 

我不知道爲什麼,當項目的大小縮小列表框不縮水,雖然我已經設置了ListBox的大小自動和Horizo​​ntalAlignment以左

由於提前, 弗蘭克

回答

5

我終於找到了解決方案this post。問題是,從Silverlight 3開始,ListBox使用VirtualizationStackPanel來顯示ListItems。除了StackPanel之外,VirtualizationStackPanel使用它獲得的所有空間,並且從不將其返回。因此,當列表中最大的項目收縮時,ListBox本身可能會縮小,因爲現在存在未使用的空間,所以ListBox的寬度(以及高度)仍然保持不變,因爲VirtualizationStackPanel無法正確收縮。

爲了解決這個問題,我們可以強制ListBox使用StackPanel而不是VirtualizationStackPanel。請注意,這可能以性能爲代價!

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

    ... // other listbox related stuff 

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

</ListBox> 
+0

感謝您花時間將此解決方案發布到您自己的問題中。我遇到了同樣的問題,而且效果很好! – 2011-06-23 13:24:49

0

嗯...我沒有所有的代碼。但是,我簡化了上面的內容,它起作用了。

我希望這能幫助你以某種方式找出你的問題。再一次,它可能是這個控制的父母導致的問題。這也可能是你正在申請的一種風格。嘗試從您的控件中刪除所有不必在其中的內容,然後將其慢慢添加回來以找到罪魁禍首。

我創建了一個新的silverlight應用程序,這實際上是它唯一的東西。列表框按預期增長和縮小。

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> 

代碼背後:

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

我還沒有解決這個問題,但因爲它不是最重要的,所以它被擱置,直到其他功能被實現。我認爲可能造成這種情況的一件事是,UC的父母是一個畫布,但是當它放置在一個柵格中時,問題仍然保持不變。如果我以某種方式完成它,我會回報。 – Aaginor 2010-07-09 10:54:23

+0

在我的表上再次出現這個問題,我發現,當元素的大小發生變化但項目列表發生更改(並且列表框可能重新呈現內容)時,ListBox不會收縮。但是,只需通過刪除文本來更改最大行的大小,當添加(或刪除)某個項目時,Listbox的大小隻會縮小。 – Aaginor 2011-01-06 14:17:17