16

Does anyone know if it's even possible to enter a line break into a WPF Wrap panel? It goes against what the wrap panel is for, so I'm not sure if it's possible.

And if it's not, is there any other WPF control that actually allows me to enter a line break into it and supports adding children (my own custom controls?)

mrid
  • 5,782
  • 5
  • 28
  • 71
Dominic K
  • 6,975
  • 11
  • 53
  • 62
  • A wrap panel holds UI elements, and you can add your own custom controls anywhere. Please clarify what you are trying to accomplish and where you are encountering difficulty. – Jay Aug 27 '10 at 18:34
  • 1
    @Jay- I want a line break in a WPF Wrap panel. There's my difficulty and what I am trying to accomplish. – Dominic K Aug 27 '10 at 18:36

2 Answers2

26
public class NewLine : FrameworkElement
{
    public NewLine()
    {
        Height = 0;
        var binding = new Binding
        {
            RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(WrapPanel), 1),
            Path = new PropertyPath("ActualWidth")
        };
        BindingOperations.SetBinding(this, WidthProperty, binding);
    }
}

<WrapPanel>
    <TextBox Text="Text1"/>
    <TextBox Text="Text2"/>
    <my:NewLine/>
    <TextBox Text="Text3"/>
    <TextBox Text="Text4"/>
</WrapPanel>
18

This is a line break in a WrapPanel:

<WrapPanel>
    <TextBlock Text="&#xD;"/>
</WrapPanel>

Update

I think I figured out what you're trying to ask. If you have a WrapPanel that is laying out by row, and you want to force it to the next row, you can replace the single WrapPanel with

 <StackPanel Orientation="Vertical">
  <StackPanel Orientation="Horizontal">
   <!-- items -->
  </StackPanel>
  <StackPanel Orientation="Horizontal">
   <!-- items -->
  </StackPanel>
  <StackPanel Orientation="Horizontal">
   <!-- items -->
  </StackPanel>
 </StackPanel>

If you want to preserve wrapping of individual rows, you can use WrapPanels inside the vertical StackPanel.

Jay
  • 56,361
  • 10
  • 99
  • 123
  • Yes, your update is exactly what I'm thinking! The only problem I have now is that I am adding element programatically like this: `wrapPanel.childern.add(element)`. However, if I create a new stackpanel for every line break, I have to change `wrapPanel/stackPanel` to `stackPanel2`. Is there a way to add elements to the newest panel? – Dominic K Aug 27 '10 at 19:03
  • @DMan `WrapPanel latestPanel = new WrapPanel();` Every time you create a new `StackPanel` or `WrapPanel`, assign it to `latestPanel`, and then add children to it. – Jay Aug 27 '10 at 19:16