5

所以我正在设计一个 ListBox 的样式,并且当 ListBox 被禁用时,我需要做一个灰色的样式。但是,当我查看 Blend 中的状态选项卡时,只有验证状态存在 - 没有包括禁用状态在内的常见通用状态的迹象。

我尝试创建一个没有自定义样式而只有一个 ListBox 的 vanilla 项目,并且发生了同样的事情。我的问题是,如何为 ListBox 设置禁用状态的样式?我错过了一些明显的东西吗?

4

2 回答 2

1

ListBox 是一个嵌套控件。

您可能必须设置包含 ListBoxItem(s) 的 ScrollViewer 控件的样式。

以下两个链接说明了如何设置 ListBox 的样式。它们不是您问题的直接答案,但它们可能会让您对它的工作原理有所了解。

http://www.codeproject.com/KB/expression/ListBoxStylingSilverlight.aspx

http://www.codeproject.com/KB/expression/ListBoxStylingPart2.aspx

于 2010-08-16T05:08:19.640 回答
1

首先尝试了简单的方法:编辑 ListBoxItem 模板,而不是 List 框。它是以禁用状态显示的项目,而不是列表框。

在混合中:“编辑其他模板”>“编辑生成的项目容器(ItemContainerStyle)”>编辑副本。

作为测试,我在禁用状态下强制背景颜色为红色(见下图)。背景颜色通常来自父列表。XAML 太大,无法在此处列出。

列表框中的项目容器由一个包含 3 个矩形(以提供边框颜色效果)的网格和一个用于保存实际项目内容的内容容器组成。

  • 填色
  • 填充颜​​色2
  • 内容演示者
  • 焦点视觉元素

样本输出

明显的问题......项目下的所有空白。呸! 必须是更好的方法。

现在尝试更改 ListBox 模板: 要更改 ListBox 本身的模板,我认为您可以将 ListView 模板中滚动查看器的背景颜色绑定到控件的 IsEnabled 属性。这将需要一个自定义值转换器(将 IsEnabled bool? 转换为 Brush 对象),但它们的创建非常简单。

TemplateBinding 不支持转换器,但我发现您可以在模板中使用普通绑定,如果您使用 RelativeSource

<ScrollViewer x:Name="ScrollViewer" BorderBrush="Transparent" BorderThickness="0" Background="{Binding IsEnabled, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource Bool2Color}}" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}">

结果如下所示:

替代文字替代文字

The code for the value convertor is below

    public class BoolToColourConverter : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool?)
            {
                return new SolidColorBrush((value as bool?).Value ? Colors.Red : Colors.Orange);
            }
            throw new NotImplementedException();
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
于 2010-08-18T15:52:50.287 回答