相当于WPF WrapPanel的'FlowBreak'属性

时间:2015-04-02 01:35:02

标签: wpf windows winforms

Windows窗体中,将项目放入 FlowLayoutPanel 控件的工作方式与在 Windows演示文稿中使用 WrapPanel 的方式非常相似基金会(WPF)。

FlowLayoutPanel中的项目可以将 FlowBreak 属性设置为 true ,以指示面板应移动到项目后面的下一行的开头,无论如何当前行中剩余的空间很大。基本上它是在说“在这之后换行”。

我现在正在使用WPF进行项目,我需要知道在使用WPF WrapPanel控件时我是如何完成等效的。

我已经知道如何用蛮力做到这一点。我希望有一种更优雅,更简单的方法。有什么想法吗?

1 个答案:

答案 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>

enter image description here

如果你希望你的XAML更清洁/更清晰(即没有绑定和虚拟Border),那么你可以创建自己的FrameworkElement,其设计总是匹配宽度祖先WrapPanel

请在此处查看NewLine元素: