在 Windows窗体中,将项目放入 FlowLayoutPanel 控件的工作方式与在 Windows演示文稿中使用 WrapPanel 的方式非常相似基金会(WPF)。
FlowLayoutPanel中的项目可以将 FlowBreak 属性设置为 true ,以指示面板应移动到项目后面的下一行的开头,无论如何当前行中剩余的空间很大。基本上它是在说“在这之后换行”。
我现在正在使用WPF进行项目,我需要知道在使用WPF WrapPanel控件时我是如何完成等效的。
我已经知道如何用蛮力做到这一点。我希望有一种更优雅,更简单的方法。有什么想法吗?
答案 0 :(得分:1)
你可以使用这个技巧:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<WrapPanel x:Name="mywrappanel">
<TextBox Text="Text1"/>
<TextBox Text="Text2"/>
<TextBox Text="Text3"/>
<Border Width="{Binding Path=ActualWidth, ElementName=mywrappanel}"/>
<TextBox Text="Text4"/>
<TextBox Text="Text5"/>
</WrapPanel>
</Page>
它正在做的是使用没有高度的虚拟元素(因此它是“隐藏的”)但宽度与WrapPanel
匹配,因此您可以确定它不适合当前行,并“填补”下一个。
您可以使用任何FrameworkElement
派生元素作为虚拟元素......只需选择一个轻量级元素以避免不必要的内存使用。
如果您不想为RelativeSource
命名,则可以使用使用WrapPanel
的绑定。
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<WrapPanel x:Name="mywrappanel">
<TextBox Text="Text1"/>
<TextBox Text="Text2"/>
<TextBox Text="Text3"/>
<Border Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type WrapPanel}}}"/>
<TextBox Text="Text4"/>
<TextBox Text="Text5"/>
</WrapPanel>
</Page>
为了更好地想象它正在做什么......只需给它一个高度和一些颜色。
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<WrapPanel x:Name="mywrappanel">
<TextBox Text="Text1"/>
<TextBox Text="Text2"/>
<TextBox Text="Text3"/>
<Border Height="20" Background="Red" Width="{Binding Path=ActualWidth, ElementName=mywrappanel}"/>
<TextBox Text="Text4"/>
<TextBox Text="Text5"/>
</WrapPanel>
</Page>
如果你希望你的XAML更清洁/更清晰(即没有绑定和虚拟Border
),那么你可以创建自己的FrameworkElement
,其设计总是匹配宽度祖先WrapPanel
。
请在此处查看NewLine
元素: