【问题标题】:WPF move middle control to next row when width exceeds available space当宽度超过可用空间时,WPF 将中间控件移动到下一行
【发布时间】:2019-03-06 19:22:33
【问题描述】:

我目前在我的窗口顶部有 3 个用户控件,我想根据可用空间对它们进行相应的排列。我想要的是在有可用空间时水平对齐 3 个控件,但我希望在调整窗口大小时中心控件向下移动到新的行/行。左右控件应始终水平对齐。所有 3 个控件都是固定宽度。下面的例子。



3 个控件对齐的宽窗口。



小窗口 - 中间的 UserControl 移到下方。

我尝试过使用WrapPanelDockPanel,但我认为这两个都不是我想要的。我想我想要的是介于两者之间的某个地方。

是否有使用任何标准 WPF 控件执行此操作的好方法,或者是扩展 Panel 并自己实现此逻辑的最佳解决方案?

【问题讨论】:

  • 左右控件的大小是否固定?
  • 我没有看到任何内置控件这样做,您将编写代码。当用户将窗口缩小到中间不适合的程度时会发生什么?不会有很大的差距吗?或者这是针对不同尺寸的显示器,用户并没有真正通过拖动来调整窗口大小?
  • @DenisSchaf 是的,都是固定大小的。
  • @Andy 我应该提到我的窗口宽度最小值被限制为不允许这样做。以下控件(不在示例中)是全宽的,需要最小宽度。

标签: c# wpf xaml


【解决方案1】:

这称为自适应布局,WPF 没有内置控件来支持这种布局。 尽管使用触发器可能会得到一些令人愉快的结果。请看: How can I create an adaptive layout in WPF?

【讨论】:

    【解决方案2】:

    我尝试实现您想要的相同功能。这是我的代码的结果:

    XAML:

    <Window x:Class="Test.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800"
            TextOptions.TextFormattingMode="Display">
        <Grid x:Name="Grid" Margin="20" VerticalAlignment="Top" SizeChanged="Grid_SizeChanged">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition/>
                <ColumnDefinition Width="auto"/>
            </Grid.ColumnDefinitions>
            <Button Width="160" Height="40" VerticalAlignment="Top" Content="Left UserControl"/>
            <Button x:Name="MiddleUserControl" Grid.ColumnSpan="3" Width="300" Height="60" Content="Middle UserControl"/>
            <Button Grid.Column="2" Width="160" Height="40" VerticalAlignment="Top" Content="Right UserControl"/>
        </Grid>
    </Window>
    

    C#:

    using System.Windows;
    using System.Windows.Controls;
    
    namespace Test
    {
        /// <summary>
        /// Логика взаимодействия для MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
            {
                if (Grid.ColumnDefinitions[1].ActualWidth < MiddleUserControl.ActualWidth + 40)
                {
                    Grid.SetRow(MiddleUserControl, 1);
                    MiddleUserControl.Margin = new Thickness(0, 20, 0, 0);
                }
                else
                {
                    Grid.SetRow(MiddleUserControl, 0);
                    MiddleUserControl.Margin = new Thickness(0);
                }
            }
        }
    }
    

    【讨论】:

    • 这很好用+1。但在我看来,它不是 MVVM ......还是因为你只操纵视图?我建议将逻辑放入转换器中,使其与 MVVM 保持一致。顺便说一句,想知道那个 gif 是如何制作的 :)
    • @DenisSchaf 首先,您使用任何视频录制软件录制视频。其次,您可以使用任何在线转换器将视频转换为 gif 动画。
    猜你喜欢
    • 2018-01-16
    • 2011-01-29
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2012-06-24
    • 2016-08-23
    相关资源
    最近更新 更多