所以我正在设计一个 ListBox 的样式,并且当 ListBox 被禁用时,我需要做一个灰色的样式。但是,当我查看 Blend 中的状态选项卡时,只有验证状态存在 - 没有包括禁用状态在内的常见通用状态的迹象。
我尝试创建一个没有自定义样式而只有一个 ListBox 的 vanilla 项目,并且发生了同样的事情。我的问题是,如何为 ListBox 设置禁用状态的样式?我错过了一些明显的东西吗?
所以我正在设计一个 ListBox 的样式,并且当 ListBox 被禁用时,我需要做一个灰色的样式。但是,当我查看 Blend 中的状态选项卡时,只有验证状态存在 - 没有包括禁用状态在内的常见通用状态的迹象。
我尝试创建一个没有自定义样式而只有一个 ListBox 的 vanilla 项目,并且发生了同样的事情。我的问题是,如何为 ListBox 设置禁用状态的样式?我错过了一些明显的东西吗?
ListBox 是一个嵌套控件。
您可能必须设置包含 ListBoxItem(s) 的 ScrollViewer 控件的样式。
以下两个链接说明了如何设置 ListBox 的样式。它们不是您问题的直接答案,但它们可能会让您对它的工作原理有所了解。
http://www.codeproject.com/KB/expression/ListBoxStylingSilverlight.aspx http://www.codeproject.com/KB/expression/ListBoxStylingPart2.aspx首先尝试了简单的方法:编辑 ListBoxItem 模板,而不是 List 框。它是以禁用状态显示的项目,而不是列表框。
在混合中:“编辑其他模板”>“编辑生成的项目容器(ItemContainerStyle)”>编辑副本。
作为测试,我在禁用状态下强制背景颜色为红色(见下图)。背景颜色通常来自父列表。XAML 太大,无法在此处列出。
列表框中的项目容器由一个包含 3 个矩形(以提供边框颜色效果)的网格和一个用于保存实际项目内容的内容容器组成。
明显的问题......项目下的所有空白。呸! 必须是更好的方法。
现在尝试更改 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();
}
}