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
相关产品推荐
相关产品推荐

