Silverlight 4:Listbox不';当它的物品缩水时,它不会缩水

Silverlight 4:Listbox不';当它的物品缩水时,它不会缩水,silverlight,listbox,Silverlight,Listbox,从中,我将问题深入到一个listbox,当listbox项收缩时,它不会调整大小。当项目的大小增大时,它会相应地调整大小,但当项目的大小减小时,它不会收缩 这些项可以增长/收缩,因为这些项包含文本框,文本框随输入调整大小 Jeremiah建议开始一个新问题,并显示更多代码,因此我们开始: 我们的邪恶列表框是UserControl的一部分,它包含一个带有标签(HorizontalAlignment=Center)、列表框(HA=Left)和按钮(HA=Right)的StackPanel。listb

从中,我将问题深入到一个listbox,当listbox项收缩时,它不会调整大小。当项目的大小增大时,它会相应地调整大小,但当项目的大小减小时,它不会收缩

这些项可以增长/收缩,因为这些项包含文本框,文本框随输入调整大小

Jeremiah建议开始一个新问题,并显示更多代码,因此我们开始:

我们的邪恶列表框是UserControl的一部分,它包含一个带有标签(HorizontalAlignment=Center)、列表框(HA=Left)和按钮(HA=Right)的StackPanel。listbox项是数据链接到ObservableCollection的

您将在ListBox和ListBoxItems上识别美丽的背景色。我用它们来判断这些项目或列表框本身是否收缩。我发现,项目缩小了,但列表框没有

好的,下面是我的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>

我不知道为什么当项目的大小缩小时列表框不会缩小,尽管我已经将列表框的大小设置为“自动”,将“水平对齐”设置为“左”

提前感谢,,
弗兰克

嗯。。。我没有你所有的代码。但是,我将上面的内容简化为这个,它是有效的

我希望这能在某种程度上帮助你解决你的问题。同样,它可能是导致问题的该控件的父控件。它也可能是您正在应用的样式之一。试着从你的控制中去掉所有不需要的东西,然后慢慢地把它们加回去,找到罪魁祸首

我创建了一个新的silverlight应用程序,这实际上是其中唯一的东西。列表框会按预期的大小增减

XAML:


我终于找到了解决办法。问题是,从Silverlight3开始,ListBox使用VirtualizationStackPanel显示ListItems。除了StackPanel之外,VirtualizationStackPanel使用它获得的所有空间,从不将其返回。因此,当列表中最大的项目收缩时,列表框本身可能会收缩,因为现在有未使用的空间,列表框的宽度(以及高度)将保持不变,因为VirtualizationStackPanel没有正确收缩

为了解决这个问题,我们可以强制ListBox使用StackPanel而不是VirtualizationStackPanel。请注意,这可能会以性能为代价

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

    ... // other listbox related stuff

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

</ListBox> 

... // 其他列表框相关的东西

我还没有解决这个问题,但由于它不是最优先考虑的问题,所以在实现其他功能之前,它将被搁置。我认为这可能是因为UC的父对象是画布,但当将其放置在网格中时,问题仍然存在。如果我以某种方式完成了它,我会报告回来。当我的表上再次出现这个问题时,我发现,当元素的大小改变时,列表框不会缩小,但当项目列表改变时(列表框可能会重新呈现内容)。但是,如果只是通过删除文本来更改最大行的大小,则在添加(或删除)项目时,列表框的大小只会缩小,感谢您花时间将此解决方案发布到您自己的问题。我也有同样的问题,这很有效!
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);
        }
    }
}
<ListBox HorizontalContentAlignment="Left" FontSize="9.333" HorizontalAlignment="Left"> 

    ... // other listbox related stuff

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

</ListBox>