C# 列表框项中的第一个元素与第二个元素重叠

C# 列表框项中的第一个元素与第二个元素重叠,c#,wpf,xaml,C#,Wpf,Xaml,我有一个Listbox,每个Listbox项都包含一个DockPanel,其中包含两个元素TextBlock和一个标签。以下是xaml代码- <ListBox HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> <ListBoxItem> <DockPanel>

我有一个Listbox,每个Listbox项都包含一个DockPanel,其中包含两个元素TextBlock和一个标签。以下是xaml代码-

        <ListBox HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
           <ListBoxItem>
            <DockPanel>
                <TextBlock Text="Ted its so wonderfull I am gere asdf asdf asdf adsf asdf asdf asdfasf asfd asf asdf asdf asdf asdf asdasfd asf " TextWrapping="Wrap"></TextBlock>
                <Label Content="Click Me" HorizontalAlignment="Right"></Label>
            </DockPanel>                
        </ListBoxItem>

        <ListBoxItem>
            <DockPanel>
                <TextBlock Text="Ted its so wonderfull Ted its so wonderfull I am gere asdf asdf asdf adsf asdf asdf asdfasf asfd asf asdf asdf asdf asdf asdasfd asf" TextWrapping="Wrap"></TextBlock>
                <Label Content="Click Me" HorizontalAlignment="Right"></Label>
            </DockPanel>
        </ListBoxItem>
    </ListBox>

所以我希望有一个窗口,其中每一行都有两个元素第一个Column是文本块,下一个是标签。我为标签添加了HorizontalContentAlignment=stretch和HorizontalAlignment=Right,以便当用户调整窗口大小时,标签应位于右端

但我在上面代码中遇到的问题是,当我调整窗口大小时,文本块开始换行时,Textblock隐藏/重叠Label元素。在某些情况下,当文本块中的单词与窗口右端完全对齐时,标签完全隐藏,或者部分隐藏


为什么第二个元素会重叠或隐藏?我想始终显示“单击我”标签,如何实现这一点

您可以使用网格。第一列使用所有可用空间,第二列为“单击”标签保留空间

        <ListBoxItem>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock Text="Ted its so wonderfull I am gere asdf asdf asdf adsf asdf asdf asdfasf asfd asf asdf asdf asdf asdf asdasfd asf " TextWrapping="Wrap"></TextBlock>
                <Label Grid.Column="1" Content="Click Me" HorizontalAlignment="Right"></Label>
            </Grid>
        </ListBoxItem>

下图显示了与停靠方式相比的网格


只需指出,在其他场景中如要添加到
ListBoxItem
内容中的未知数量的元素,例如,使用
DockPanel
并不是那么糟糕

例如:

  • 列表框中的第一项是
    文本和
    标签
  • 第二项,我想要一个
    文本
    ,一个
    标签
    和一个
    按钮
  • 等等
对于
网格
,除非您添加很多东西(使用ContentTemplate和绑定,甚至是代码隐藏),否则它将无法工作,而
DockPanel
正是在这一点上很有用

您的方法的错误之处在于,您将
文本块
放在
标签
之前。在DockPanel中,顺序很重要,第一项优先于第二项,第二项优先于第三项。。。如果前一个项目占用了所有剩余空间(TextBlock使用其超长
Text
值所做的),则后续任何其他项目都不会按预期绘制

别忘了指定
停靠
模式

所以,为了澄清,这里使用DockPanel没有什么错,但是项目顺序很重要

<ListBox HorizontalContentAlignment="Stretch" 
    ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListBoxItem>
        <DockPanel>
            <!-- Declare your Label first and dock it to the right -->
            <Label 
                DockPanel.Dock="Right" />
            <TextBlock 
                Text="Ted its so wonderfull I am gere asdf asdf asdf adsf asdf asdf asdfasf asfd asf asdf asdf asdf asdf asdasfd asf " TextWrapping="Wrap" />
        </DockPanel>                
    </ListBoxItem>

    <!-- ... -->

</ListBox>

有些UIElement(如Label)在DockPanel中停靠时(实际上)不需要
水平对齐
。在这种情况下,只有
垂直对齐
起作用

规则是:

  • 请记住,DockPanel为每个项目分配一个矩形区域
  • 项目按顺序获得分配的区域
  • DockPanel默认停靠在左侧
  • DockPanel更好地处理占据一小块区域的项目列表,这些项目首先声明为,然后相应地停靠,然后是大小可变的最后一个,如果可用,将填充剩余空间
  • 当可用区域不够宽时,DockPanel将始终尝试至少显示每个项目的一小部分(因此,当您希望项目保持完全可见时,请小心添加约束,例如将DockPanel放在网格列或行中;)
最后,这是一个解释为什么标签是 与文本块重叠–适用于希望掌握文本的其他读者 DockPanel

但是,是的,当我已经知道一个星期内我将拥有多少物品时 容器,我将使用网格,99%的时间,因为我可以绑定行 和列大小直接,而使用DockPanel、StackPanel等 必须逐一引用每个包含的项目

我确实同意公认的答案:)


回答得好。我投票支持自己。我已尝试解决用户问题,但此答案试图解释如何解决以及原因。谢谢。)哦另一个可能在组合
ListBoxItem+Grid
ListBoxItem+DockPanel
中起作用的事情是,将停靠在右侧:将样式设置器添加到
ListBoxItem
声明的子
ListBoxItem
属性中,如前所述。ListBoxItem的容器不会自动拉伸以填充所有空间,因此,如果包含的内容不够宽,则停靠到右侧实际上不起作用。:)这里没有直接涉及,但有关联。希望为任何经历过这种情况的人节省一些时间。