4

这是交易。我可以创建一个ListBox并对其进行设计。我可以编辑该模板的副本,以便在Expression Blend 3中可以使用状态。并且可以更改状态,以便在选择时修改订单项的背景颜色。但是由于ContentPresenter的原因,我无法更改文本的前景色!有没有人有任何示例XAML显示如何完成这个看似简单的任务?如何使用VisualStateManager更改ListBoxItem的文本颜色(前景)?

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

我真的认为微软重新思考XAML的做法或使混合更加完整的工具。它应该工作的方式是我应该能够点击ANY元素并为其定义状态。如果我试图违反规则,Blend应该告诉我这一点,并提供一种方法来解决它。只是让国家面板变空是没有帮助的。

回答

1

按说ListBox自己对自己负责,包括Foreground颜色,如果需要的话,他们使用的是什么项目的内容。这些项目可能是一系列图像,在这种情况下Foreground毫无意义。这些项目可能是一个复杂的多元素UI,其中包含各种不同的文本项目,每个需要不同的Foreground颜色,因此ListBox提供单一Foreground颜色的想法是没有意义的。

这就是为什么该项目容器的默认模板使用ContentPresenter,这基本上意味着“到位arbitary项目在这里的内容”。

如果你想在一般创建列表框新的样式,使用它们的容器项目的风格,那么你就必须接受这种限制,你可以VSM不知道所包含的项目的细节。

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

例如,你可以在这个XAML中更换ContentPresenter: -

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

注意,项目的Horizo​​ntalAlignment填充,并且是相同的演示使用。在这种情况下,我使用名为“ContentItem”的单个TextBlock并将其绑定到源对象Property1属性。

现在该模板包含一个名为TextBlock用于显示该项目,我可以摆弄VSM修改其各种不同视觉状态的Foreground

+0

我用一个由用户控件组成的自定义DataTemplate替换了ContentPresenter。这个控件有一个文本块。为了VSM的工作,我不知何故必须在ListBox引发SelectionChanged事件时获得对实际自定义控件实例的引用。这是有问题的。 VSM.GoToState方法需要传递给它的实例,以便它可以工作。我似乎无法获得参考。想法?我同意你应该能够'摆弄vsm'来完成这项工作,但应该是最佳的词,在这里。不过,我还没有看到有人这样做。 – Wade 2010-02-04 19:43:30

+0

现在,我可以在控件的Loaded事件中将每个自定义DataTemplate实例捕获到数组中,然后使用数字索引来查找基于父列表框的SelectedIndex属性的实例,但这很难扩展。 – Wade 2010-02-04 19:45:06

+0

嗯,我确实找到了一种不使用VSM的方法,但它消除了动画播放的能力。我将Textblock的Foreground更改为{TemplateBinding Foreground},然后在ListBoxItem上设置Foreground。叹息...... – Wade 2010-02-04 20:35:36

1

对不起,复活一个老问题,但我被困在同样的问题,并找到了解决办法。我会分享它,因为谁知道,它可能对某人有用。

这真的很简单:如果你与你的ContentControl中替换模板的ContentPresenter,那么它的工作原理(ContentControl中具有前景属性)。

0

啊,很酷!感谢您的反馈。我想我最终做出了一个用户控件,并公开了一个设置颜色但我不记得的Foreground属性。你的答案与前面的答案相结合是非常有用的。另一方面,我确实分解并学习了如何使用依赖属性来创建自己的自定义控件,整个9码和男人,让我告诉你,这是非常值得的。我觉得现在我可以用WPF/SL做任何事情。

相关问题