【问题标题】:ListBox Foreground Color Problem for Selected Item Without ItemContainer没有 ItemContainer 的选定项目的列表框前景色问题
【发布时间】:2009-12-09 16:40:59
【问题描述】:

alt text http://akashkava.com/blog/wp-content/uploads/2009/12/ListBoxItem-Selection-Problem.png

以下代码,行为有点奇怪。

<ListBox SelectionMode="Multiple">

        <StackPanel>
            <TextBlock>Selection is Black</TextBlock>
        </StackPanel>

        <ListBoxItem>
            <StackPanel>
                <TextBlock>Selection is White</TextBlock>
            </StackPanel>
        </ListBoxItem>
</ListBox>

请注意,第一个选择保持黑色,这是因为 Item 不是它自己的 ItemContainer,但是在第二种情况下,Item 是它自己的 ItemContainer,因此样式可以正常工作。大多数时候我们通过模板填充数据,并且每次我们的 Item 不是它自己的 ItemContainer 时,这就是 TextBlock 在前景色方面表现得很奇怪的原因。

重要提示:我正在寻找“为什么会发生这种情况”的答案,而不是如何解决它,我知道解决方法 TextElement.Foreground="{TemplateBinding Foreground}",但我想知道为什么会发生这种情况。

【问题讨论】:

    标签: wpf xaml .net-3.5 listboxitem


    【解决方案1】:

    我猜,那是因为这里的逻辑树不同:

    alt logical tree http://img13.imageshack.us/img13/9082/logicaltree.jpg

    当您显式指定 ListBoxItem 时,您会将其添加到逻辑树中,并且 Foreground 会继承自它。在 StackPanel 的情况下,逻辑树是不同的,并且 Foreground 是从不同的父级继承的......我相信你之前已经读过这个,但只是为了日志。 Mike Hillberg 的文章非常棒:Of logical and visual trees in WPF。他非常清楚地解释了这种行为。

    干杯

    【讨论】:

    • 感谢您的回答,您能告诉我在哪里以及如何看到这个逻辑树吗?你用什么工具来发现这个的?但我怀疑情况是否如此,因为“样式”和模板应该适用于视觉树。
    • 感谢您的回答,我详细阅读了 DPs 实际上首先遵循逻辑父项,然后是视觉对象.. 这在 itemscontrol 的情况下肯定是一个问题,我向微软报告了但他们只会说“已解决by Design”,但这只是意味着我必须重写很多库代码才能使其工作。
    猜你喜欢
    • 2011-01-09
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2010-10-07
    相关资源
    最近更新 更多