【问题标题】:GridSplitter with a fixed panel (grid column) when grid (usercontrol/window) size changes当网格(用户控件/窗口)大小发生变化时,带有固定面板(网格列)的 GridSplitter
【发布时间】:2022-01-19 19:34:03
【问题描述】:

基本上,我想模仿WinForms 中的GridSplitter.FixedPanel 功能。

XAML:

<UserControl ...>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="4*" />
            <ColumnDefinition Width="3" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <ListBox Grid.Column="0" />
        <GridSplitter 
            Grid.Column="1" Width="3" VerticalAlignment="Stretch" 
            Background="Transparent" 
            ResizeDirection="Columns" ResizeBehavior="PreviousAndNext" />
        <ListBox Grid.Column="2" />
    </Grid>
</UserControl>

这很好用,并相应地调整每一面的大小。但是假设我们调整包含此 UserControl 的(未最大化)窗口的大小,现在拆分器(自动)每一侧的两个网格列都调整大小。开始时的空间分配需要 4/5 和 1/5 的列宽比,但实际的空间分配取决于显示的数据,因此需要网格拆分器。

如何在调整窗口大小时使一列保持其宽度(例如右侧的一列,因为它承载属性、工具等),因此只调整左列的大小。

我有一些的想法:

  1. 只需在 WinForms 中模拟 FixedPanel 的代码:DragStarted、DragCompleted 和一些私有字段,例如。
  2. 使用Behavior,就像在这个SO topic 中建议的那样(我已经很多年没有使用行为了,有一些令人耳目一新的事情要做 - 老实说,我真的希望有一个仅限 XAML 的方法,但如果没有' t,我更喜欢公开新依赖属性而不是行为的代码隐藏方式)
  3. 我相信我缺少 WPF 的一项功能来实现此WPF 方式。几乎所有时候我都在想“好吧,我想我必须在后面编写代码...”,有 WPF 方式,通常更简单、更安全、易于设计并且更好,性能明智。这就是我直接询问的原因,也许会帮助其他人寻找该功能。

编程语言(就此而言):C#


编辑:在 Léo Savador 的回答之后:

请参阅:一种 WPF 方式(玩弄 XAML ColumnDefinition Width 属性)和少量代码:

bool p_layoutInitialized = false;
void UserControl_SizeChanged(object sender, SizeChangedEventArgs e) {
    if (e.NewSize.Width > 1) { // optional : && e.NewSize.Height > 1
        if (!p_layoutInitialized) {
            RightColumn.Width = new GridLength(MainGrid.ActualWidth / 5);
            p_layoutInitialized = true;
        }
    }
}

其中RightColumn 是右侧ColumnDefinition 的名称,MainGridGrid 的名称。

非常感谢,正在编写繁重的代码背后。你为我节省了很多时间:D


PS : 请不要以为我是 WinForm 粉丝。我只是提到 WinForms 来提供所需功能的比较示例,可以使用 CSS 和 JS,但更难描述。

【问题讨论】:

    标签: c# wpf xaml resize gridsplitter


    【解决方案1】:

    这里有一个简单的解决方案,我可以根据您的需要向您推荐:

    对于您的右列,不要使用动态宽度 (1*),而是使用固定宽度:

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="3" />
                <ColumnDefinition Width="160" />
            </Grid.ColumnDefinitions>
    

    如果设置固定宽度为 160:

    • 您将获得相同的初始结果(窗口初始宽度的 1/5)
    • 您仍然可以调整网格大小
    • 调整大小时,您的右栏将保持其宽度

    您还可以使用后面的代码在启动时根据窗口初始宽度计算所需的固定宽度,使其更加“动态”。

    【讨论】:

    • 聪明!我不是第一次在 Grid 上忽略简单的宽度值。哦,太感谢你了!!用小代码更新帖子以在启动时计算宽度。 WPF 非常灵活。这也使得在启动时检索分离器距离代码更轻松(保存在应用程序根目录下的二进制文件中 - 代码不存在,因为离题)太棒了!
    • 当然,WPF 并不总是直观的,但它是无限的!
    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2012-10-24
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2012-01-26
    相关资源
    最近更新 更多