【问题标题】:ListBox Disabled state in Silverlight 4Silverlight 4 中的 ListBox 禁用状态
【发布时间】:2010-08-05 04:18:53
【问题描述】:

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

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

【问题讨论】:

  • 肯定有人知道...或关心:(
  • 我在乎。不幸的是,我找到了你的帖子,因为我有同样的问题。 :-)
  • 是的,我能闻到风滚草徽章的味道...
  • 开始赏金

标签: silverlight silverlight-4.0 expression-blend styles itemtemplate


【解决方案1】:

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

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

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

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

  • 填充颜色
  • 填充颜色2
  • contentPresenter
  • FocusVisualElement

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

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

TemplateBinding 不支持转换器,但我发现你can use a normal binding in a template, if you use a 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();
        }
    }

【讨论】:

  • 虽然我以不同的方式解决了这个问题,但这是一个可行的解决方案。不幸的是,没有解决这个特殊问题的优雅方法。当我有空时,我会发布我的解决方案。
  • 我们期待看到您的替代方案(正如他们所说,“弓弦越多,音乐就越好”)。谢谢
【解决方案2】:

ListBox 是一个嵌套控件。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多