在运行时更改ListBox项样式

时间:2009-10-09 14:18:58

标签: c# wpf listbox listboxitem

我有一个列表框,其中的项目使用ResourceDictionary样式进行样式设置,然后将其附加到ItemContainerStyle属性。这给我的ListBoxItems一个BorderThickness,比方说1。

现在我想单独折叠项目,所以我使用Visibility.Collapsed,但由于某种原因,ItemContainerStyle创建的边框不会随列表框项目的其余部分消失。就好像它在我的项目后面创建了一个图层,尽管项目已经折叠,但仍然存在。

如何在运行时将ListBoxItem(或此额外图层)的BorderThickness设置为0?

此致 SK

3 个答案:

答案 0 :(得分:0)

尝试使用自定义触发器:

    <Style TargetType="{x:Type ListBoxItem}">
        <Style.Triggers>
            <Trigger Property="Visibility" Value="Collapsed">
                <Setter Property="BorderThickness" Value="0,0,0,0"/>
            </Trigger>
            <Trigger Property="Visibility" Value="Visible">
                <Setter Property="BorderThickness" Value="0,0,0,1"/>
            </Trigger>
        </Style.Triggers>
    </Style>

显然会改变你的边框厚度值,但这应该可以解决问题(或者非常接近这一点)

答案 1 :(得分:0)

我尝试重现此问题,但发现边框 按预期崩溃:

<StackPanel>
  <StackPanel.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibility" />
    <Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
      <Setter Property="BorderBrush" Value="Black" />
      <Setter Property="BorderThickness" Value="1" />
    </Style>
  </StackPanel.Resources>

  <CheckBox x:Name="_show"
            Content="Show Item 2"
            IsChecked="True" />

  <ListBox ItemContainerStyle="{StaticResource ListBoxItemStyle}">
    <ListBoxItem Content="Item 1" />
    <ListBoxItem Content="Item 2">
      <ListBoxItem.Visibility>
        <Binding ElementName="_show"
                 Path="IsChecked"
                 Converter="{StaticResource BooleanToVisibility}" />
      </ListBoxItem.Visibility>
    </ListBoxItem>
    <ListBoxItem Content="Item 3" />
  </ListBox>
</StackPanel>

您确定ListBoxItem是要折叠的对象(与ListBoxItem中的UI对象相对)吗?

答案 2 :(得分:-1)

foreach(ListBoxItem item in listBox1.Items){
   item.BorderThickness = new Thickness(0);
}

这是答案,但我不建议,因为你无法撤消样式以恢复原始的内容而应该在某些状态的基础上选择一些不同的数据绑定方法。