WPF wrappanel:管理水平和垂直行为

Posted

技术标签:

【中文标题】WPF wrappanel:管理水平和垂直行为【英文标题】:WPF wrappanel: manage horizontal and vertical behaviour 【发布时间】:2020-04-30 23:48:08 【问题描述】:

有没有什么方法可以使用 WPF Wrappanel 获得这种布局?图片中的B和C在水平模式下要垂直对齐,在垂直模式下要水平对齐。必须保留字母方向。 在图片中,从 [水平] 到 [垂直]:

Horizontal

Vertical

我试过了:

<wrappanel>
<A/>
<wrappanel>
<B/><C/>
</wrappanel>
</wrappanel>

但它的行为是不可预测的。提前谢谢你。

【问题讨论】:

有理由不使用网格吗? 你不能只使用 Grid,设置列和行,并将 A 上的 columnSpan/rowSpan 设置为 2 吗? 我发现的独特方式:在 SizeChanged 事件中添加代码:if (this.Height &gt; this.Width) wrappanel.Orientation = Orientation.Horizontal else wrappanel.Orientation = Orientation.Vertical @Clemens no:网格将 B 和 C 限制在行或列中。 @Zeronader 问题不是A,而是B和C。 【参考方案1】:

如果您只想正确对齐,则可以像这样使用 Grid。 这样,无论何时调整窗口大小,B 和 C 的宽度和高度始终相同。

    <Grid>
   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*" />
      <ColumnDefinition Width="*" />
   </Grid.ColumnDefinitions>
   <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
   </Grid.RowDefinitions>
   <Button Content="A" Grid.Column="0" Grid.RowSpan="2" />
   <Button Content="B" Grid.Column="1" Grid.Row="0"/>
   <Button Content="C" Grid.Column="1" Grid.Row="1"/>
</Grid>

【讨论】:

我试过了,但是这段代码总是产生一个左高按钮和两个右按钮。但是,调整大小并没有带来数字link... 哦,所以你想在调整大小时从水平更改为垂直?你的问题应该更清楚。您也可以尝试使用 wrap 面板,但将 B 和 C 保留在网格中,并在 Grid 或 A 上设置 minimumWidth,因此第二个项目(将是网格)将移动到 wrapPanel 中的第二行 如果您使用网格或其他任何东西,第一个包裹面板将包裹包含的网格,但包含的对象不会像图像中那样从水平包裹到垂直。第二个包装板应该可以解决这个问题,但是......这就是问题所在。我不知道如何更好地解释,对不起 好的,所以现在我无法在没有代码的情况下找到任何解决方案,但只需一点代码,您就可以制作转换器,它将整个窗口或 A 控件宽度转换为方向并将其设置在第 2 位wrapPanel

以上是关于WPF wrappanel:管理水平和垂直行为的主要内容,如果未能解决你的问题,请参考以下文章

WPF:带有 WrapPanel 的 ListBox,垂直滚动问题

WPF基础之WrapPanel面板和DockPanel面板

带有ScrollHeader和WrapPanel的ListView(ItemsPanel.ItemsPanelTemplate)

UWP 中 ListBox 内的 WrapPanel

WPF入门教程系列七——布局之WrapPanel与StackPanel

WPF水平布局和垂直布局