C# 列表框项中的第一个元素与第二个元素重叠
我有一个Listbox,每个Listbox项都包含一个DockPanel,其中包含两个元素TextBlock和一个标签。以下是xaml代码-C# 列表框项中的第一个元素与第二个元素重叠,c#,wpf,xaml,C#,Wpf,Xaml,我有一个Listbox,每个Listbox项都包含一个DockPanel,其中包含两个元素TextBlock和一个标签。以下是xaml代码- <ListBox HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> <ListBoxItem> <DockPanel>
<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放在网格列或行中;)
回答得好。我投票支持自己。我已尝试解决用户问题,但此答案试图解释如何解决以及原因。谢谢。)哦另一个可能在组合
ListBoxItem+Grid
或ListBoxItem+DockPanel
中起作用的事情是,将停靠在右侧:将样式设置器添加到ListBoxItem
声明的子ListBoxItem
属性中,如前所述。ListBoxItem的容器不会自动拉伸以填充所有空间,因此,如果包含的内容不够宽,则停靠到右侧实际上不起作用。:)这里没有直接涉及,但有关联。希望为任何经历过这种情况的人节省一些时间。