银光 4 : Listbox doesn't shrink when its items shrink

标签 silverlight listbox

来自 this question ,我将问题深入到列表框,当列表框项目缩小时,它不会调整大小。当项目的大小增加时,它会相应地调整大小,但当项目的大小减小时,它不会缩小。

项目可以增长/缩小,因为项目包含文本框,随着输入调整大小。

Jeremiah 建议用更多代码来开始一个新问题,所以我们开始:

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

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

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

我不知道为什么当项目的大小缩小时列表框不缩小,尽管我已将列表框的大小设置为 Auto 并将 Horizo​​ntalAlignment 设置为 Left

提前致谢,
坦率

最佳答案

我终于在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> 

关于银光 4 : Listbox doesn't shrink when its items shrink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3110159/

相关文章:

WPF: System.ArgumentException => {"' {0 }' is not a Visual or Visual3D."}

c# - 无法更新按钮单击WPF中的列表

silverlight - 在 Silverlight/WinRT 中仅使用 XAML 将元素定位在 Canvas 内的中心(而不是左上角)

c# - Xaml(silverlight) 到 html5 转换

WPF 图像与 XAML

c# - 如何将 ListBox 中的所有项目打印到 TextBox?

c# - WPF ListBox 按钮选择的项目

当按下向右或向左箭头键时,C# 阻止列表框控件的默认操作

python - 命名一些使用 IronPython 和 Silverlight 编写的重要站点

c# - 单击控件外部时如何关闭 Silverlight 中的弹出窗口?