代码之家  ›  专栏  ›  技术社区  ›  Newclique

如何使用VisualStateManager更改ListBoxItem的文本颜色(前景)?

  •  4
  • Newclique  · 技术社区  · 15 年前

    成交了。我可以创建一个列表框并设置其样式。我可以编辑模板的副本,使状态在ExpressionBlend 3中可用。我可以更改状态,这样当选中行项目时,它的背景色会被修改。但由于ContentPresenter,我无法更改文本的前景色!是否有人有任何示例XAML来演示如何完成这项看似简单的任务?

    答案似乎在于删除ContentPresenter并用某种类型的ListBoxItem样式或模板替换它,但这正是我陷入困境的地方。列表框的ContentPresenter引用了其他模板“TemplateBinding Template”-在哪里?另外,当我尝试以任何方式修改ContentPresenter时,状态面板变为空白,剩下的是一堆XAML。幸运的是,这里有ctrl-z!

    我真的认为微软必须重新考虑XAML方法或使Blend成为一个更完整的工具。它的工作方式是,我应该能够单击任何元素并为其定义状态。如果我试图打破规则,Blend应该告诉我这一点,并提供一种解决方法。仅仅让状态面板变空是没有帮助的。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Francesco De Vittori    14 年前

    很抱歉,我又问了一个老问题,但我在同一个问题上遇到了困难,找到了解决办法。我会把它分享给别人,因为谁知道,它可能对某人有用。

    这真的很简单:如果用ContentControl替换模板中的ContentPresenter,那么它就会工作(ContentControl有一个前台属性)。

        2
  •  1
  •   AnthonyWJones    15 年前

    通常情况下 ListBox 负责项目本身的内容,包括 Foreground 颜色,如果需要,可以使用。项目可以是一系列图像,在这种情况下 前景 毫无意义。这些项可以是一个复杂的多元素UI,包含不同的文本项,每个文本项都需要不同的 前景 颜色,所以同样的想法 列表框 提供一个 前景 颜色毫无意义。

    这就是为什么项目容器的默认模板使用 ContentPresenter 基本上就是“放任意项目内容在这里”。

    如果您想要为列表框创建一个新的样式,通常用于其容器项样式,那么您必须接受这个限制,您的VSM无法知道所包含项的详细信息。

    但是,如果要为的特定实例创建容器样式, 列表框 你了解所展示物品的类型和性质,那么你就不需要保留 任命者 在模板中。您可以直接替换为呈现每个项所需的任何XAML。

    例如,您可以替换 任命者 在XAML中:

    <Grid Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
        <TextBlock x:Name="ContentItem" Text="{Binding Property1, Mode=OneWay}" TextWrapping="Wrap" Foreground="#FFDC1C1C"/>
    </Grid>
    

    请注意,项目的填充和水平标记与演示者使用的相同。在这种情况下,我是单身 TextBlock 称为“ContentItem”,并将其绑定到源对象 Property1 财产。

    现在模板包含一个名为 控件 为了显示该项,我可以修改VSM 前景 对于各种不同的视觉状态。

        3
  •  0
  •   Newclique    14 年前

    啊,酷!感谢您的反馈。我想我最终制作了一个用户控件,并公开了一个公共前台属性,该属性设置了颜色,但我记不得了。你的回答加上前面的回答真的很有帮助。

    顺便说一句,我确实分解并学习使用依赖属性和整个9码来制作我自己的自定义控件,而且,伙计,Lemme告诉你,这是非常值得的。我觉得我现在可以用WPF/SL做任何事情。