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

WPF DataGrid默认宽度适配多显示器问题及解决方案咨询

解决方案

你的问题核心是窗口的SizeToContent="WidthAndHeight"属性导致窗口跟着内容无限扩展,加上DataGrid列的固定最小宽度设置,最终撑满多显示器宽度。以下是具体修复步骤:

1. 修正窗口大小行为

把Window的SizeToContent从WidthAndHeight改为Height,同时设置窗口初始宽度为900(对应DataGrid约840的宽度,预留边框和Margin空间),避免内容把窗口拉宽到跨显示器:

<Window x:Class="Migrations.FlatFileFolderTool.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewmodels="clr-namespace:Migrations.FlatFileFolderTool.ViewModels" 
        xmlns:fa="http://schemas.fontawesome.io/icons/"
        d:DataContext="{d:DesignInstance Type=viewmodels:MainWindowViewModel}"
        mc:Ignorable="d"
        Title="MainWindow" MinHeight="1200" MinWidth="900" Width="900" SizeToContent="Height">

2. 让DataGrid自适应父容器宽度

删除DataGrid的HorizontalAlignment="Left"属性(默认值为Stretch),这样DataGrid会自动填充父Grid的宽度,窗口拉伸时同步调整:

<DataGrid Margin="20,0,20,0"
          SelectionUnit="CellOrRowHeader"
          SelectionMode="Single"
          ItemsSource="{Binding FolderPaths}"
          AutoGenerateColumns="False"
          CanUserAddRows="False"
          HorizontalScrollBarVisibility="Auto"
          VerticalScrollBarVisibility="Auto">

3. 调整DataGrid列的宽度分配

移除DataGridTextColumn的MinWidth="810",改用Width="*"让该列占满DataGrid的剩余宽度,同时给DataGrid设置MinWidth="840"保证初始宽度符合需求:

<DataGrid MinWidth="840" Margin="20,0,20,0"
          SelectionUnit="CellOrRowHeader"
          SelectionMode="Single"
          ItemsSource="{Binding FolderPaths}"
          AutoGenerateColumns="False"
          CanUserAddRows="False"
          HorizontalScrollBarVisibility="Auto"
          VerticalScrollBarVisibility="Auto">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Header="Select All" Binding="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <DataGridCheckBoxColumn.HeaderTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding DataContext.IsSelectAllChecked, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                              Command="{Binding DataContext.SelectAllCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                              CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}"/>
                </DataTemplate>
            </DataGridCheckBoxColumn.HeaderTemplate>
        </DataGridCheckBoxColumn>
        <DataGridTextColumn Header="Folder Path" Width="*" Binding="{Binding FolderPath}" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

修改逻辑说明

  • SizeToContent="Height"仅让窗口高度自适应内容,宽度由手动控制,彻底避免内容将窗口拉到跨显示器尺寸。
  • DataGrid的Stretch对齐方式使其完全填充父容器,窗口拉伸时自动同步扩展宽度。
  • 列宽使用*分配剩余空间,保证列宽度随DataGrid整体尺寸动态调整,同时MinWidth="840"确保初始宽度符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:52:57