You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF双列布局需求:右侧GridControl折叠时左侧占满,显示时各占一半

WPF 动态两列布局实现方案

要实现右侧GridControl折叠时左侧占满整个区域,显示时左右各占一半的效果,单纯设置ColumnDefinition.Width为Auto或*无法满足需求——因为*会按比例分配空间(即使列内控件隐藏,列本身仍会占据分配的空间),而Auto仅根据内容尺寸调整,无法让左侧自动填充剩余空间。以下是两种可行的实现方式:

方案一:使用触发器动态修改列宽

通过DataTrigger绑定右侧GridControl的Visibility属性,在状态变化时直接修改列的宽度:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="LeftColumn" Width="*"/>
        <ColumnDefinition x:Name="RightColumn" Width="*"/>
    </Grid.ColumnDefinitions>

    <!-- 左侧GridControl -->
    <dxg:GridControl Grid.Column="0" />

    <!-- 右侧GridControl,命名用于触发器绑定 -->
    <dxg:GridControl x:Name="RightGrid" Grid.Column="1" />

    <Grid.Triggers>
        <!-- 右侧折叠时,左侧占满,右侧列宽设为0 -->
        <DataTrigger Binding="{Binding ElementName=RightGrid, Path=Visibility}" Value="Collapsed">
            <Setter TargetName="LeftColumn" Property="Width" Value="*"/>
            <Setter TargetName="RightColumn" Property="Width" Value="0"/>
        </DataTrigger>
        <!-- 右侧可见时,左右各占一半 -->
        <DataTrigger Binding="{Binding ElementName=RightGrid, Path=Visibility}" Value="Visible">
            <Setter TargetName="LeftColumn" Property="Width" Value="*"/>
            <Setter TargetName="RightColumn" Property="Width" Value="*"/>
        </DataTrigger>
    </Grid.Triggers>
</Grid>

方案二:使用值转换器绑定列宽

通过自定义IValueConverter,将Visibility状态转换为对应的GridLength,实现更灵活的复用:

第一步:实现转换器

public class VisibilityToGridLengthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var visibility = (Visibility)value;
        var isInverse = parameter?.ToString() == "Inverse";
        
        if (isInverse)
            return visibility == Visibility.Collapsed ? new GridLength(1, GridUnitType.Star) : new GridLength(1, GridUnitType.Star);
        else
            return visibility == Visibility.Visible ? new GridLength(1, GridUnitType.Star) : new GridLength(0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

第二步:在XAML中引用并使用

<Window.Resources>
    <local:VisibilityToGridLengthConverter x:Key="VisToGridLength"/>
</Window.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding ElementName=RightGrid, Path=Visibility, Converter={StaticResource VisToGridLength}, ConverterParameter=Inverse}"/>
        <ColumnDefinition Width="{Binding ElementName=RightGrid, Path=Visibility, Converter={StaticResource VisToGridLength}}"/>
    </Grid.ColumnDefinitions>

    <dxg:GridControl Grid.Column="0" />
    <dxg:GridControl x:Name="RightGrid" Grid.Column="1" />
</Grid>

两种方案都能实现需求:触发器方式无需后台代码,直观易维护;转换器方式适合在多个布局中复用逻辑。

内容的提问来源于stack exchange,提问作者By_All_Means_Rome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:01:21