4

这是交易。我可以创建一个 ListBox 并为其设置样式。我可以编辑模板的副本,使状态在 Expression Blend 3 中可用。我可以更改状态,以便在选择时修改行项目的背景颜色。但是由于 ContentPresenter,我无法更改文本的前景色!有没有人有任何示例 XAML 来展示如何完成这个看似简单的任务?

答案似乎在于删除 ContentPresenter 并用某种 ListBoxItem 样式或模板替换它,但这是我卡住的地方。ListBox 的 ContentPresenter 引用了其他一些模板“{TemplateBinding Template}” - 那在哪里?此外,当我尝试以任何方式修改 ContentPresenter 时,States 面板变为空白,并且我留下了一堆 XAML。幸运的是,有 CTRL-Z!

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

4

3 回答 3

1

通常ListBox情况下,他们不对物品本身的内容负责,包括Foreground他们使用的颜色(如果需要)。这些项目可能是一系列图像,在这种情况下Foreground是没有意义的。这些项目可能是一个复杂的多元素 UI,其中包含各种不同的文本项目,每个项目都需要不同Foreground的颜色,所以再次ListBox提供单一Foreground颜色的想法是没有意义的。

这就是 Item 容器的默认模板使用 a 的原因ContentPresenter,这基本上意味着“在此处放置任意项目内容”。

如果您想为列表框创建新样式以用于其容器项样式,那么您将不得不接受此限制,您的 VSM 无法知道所包含项的详细信息。

但是,如果您正在为特定实例创建容器样式ListBox并且您了解所呈现项目的类型和性质,那么您不需要将 保留ContentPresenter在模板中。您可以直接替换为呈现每个项目所需的 Xaml。

例如,您可以将ContentPresenterXaml 中的 替换为:-

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

请注意,项目的 Padding 和 Horizo​​ntalAlignment 与演示者使用的相同。在这种情况下,我使用单个TextBlock称为“ContentItem”并将其绑定到源对象Property1属性。

现在模板包含一个TextBlock用于显示项目的命名,我可以使用 VSM 来修改它Foreground以适应各种不同的视觉状态。

于 2010-02-04T10:18:05.510 回答
1

很抱歉重新提出一个老问题,但我被困在同一个问题上并找到了解决方案。我会分享它,谁知道,它可能对某人有用。

这非常简单:如果您将模板中的 ContentPresenter 替换为 ContentControl,那么它就可以工作(ContentControl 具有 Foreground 属性)。

于 2010-08-19T21:36:15.187 回答
0

啊,酷!感谢您的反馈。我想我最终制作了一个用户控件并公开了一个设置颜色的公共 Foreground 属性,但我不记得了。您的答案与之前的答案相结合真的很有帮助。

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

于 2010-08-20T14:29:19.730 回答