鼠标拖动Grid时保持单元格高度与宽度不变的实现方法
实现拖动Grid时维持单元格宽高不变的方案
看起来你是想通过拖动操作(结合你给出的XAML,应该是用Thumb调整列宽?)让Grid的单元格始终保持宽高一致对吧?我给你两种贴合需求的可行解决方案:
方案1:ViewModel同步属性(适配MVVM模式)
如果你的项目采用MVVM架构,最规范的方式是在ViewModel里同步列宽和行高的绑定属性。比如你当前绑定了ThumbWidthSelector作为中间列的宽度,那可以在这个属性的setter逻辑里,同步更新对应的行高属性:
private double _thumbWidthSelector; public double ThumbWidthSelector { get => _thumbWidthSelector; set { if (_thumbWidthSelector != value) { _thumbWidthSelector = value; OnPropertyChanged(nameof(ThumbWidthSelector)); // 同步更新行高属性,确保单元格宽高一致 ThumbHeightSelector = value; } } } private double _thumbHeightSelector; public double ThumbHeightSelector { get => _thumbHeightSelector; set { if (_thumbHeightSelector != value) { _thumbHeightSelector = value; OnPropertyChanged(nameof(ThumbHeightSelector)); } } }
接着修改你的XAML行定义,绑定到这个同步的行高属性:
<Grid.RowDefinitions> <RowDefinition Height="{Binding Path=ThumbSelectorTopMargin, Mode=TwoWay}"/> <RowDefinition Height="{Binding Path=ThumbHeightSelector, Mode=TwoWay}"/> <RowDefinition Height="{Binding Path=ThumbSelectorBottomMargin, Mode=TwoWay}" /> </Grid.RowDefinitions>
这样当你拖动Thumb调整列宽时,行高会自动同步变化,单元格的宽高就始终保持一致了。
方案2:XAML直接复用列宽绑定属性
如果不需要单独控制行高的逻辑,你可以直接把行高绑定到列宽的同一个属性上,省去ViewModel里的同步代码,更简洁:
<Grid.RowDefinitions> <RowDefinition Height="{Binding Path=ThumbSelectorTopMargin, Mode=TwoWay}"/> <RowDefinition Height="{Binding Path=ThumbWidthSelector, Mode=TwoWay}"/> <RowDefinition Height="{Binding Path=ThumbSelectorBottomMargin, Mode=TwoWay}" /> </Grid.RowDefinitions>
这种方式直接让中间行的高度和中间列的宽度绑定,一步实现宽高同步。
额外场景:拖动Grid容器时保持单元格尺寸固定
如果你的需求是拖动Grid所在的窗口/父容器改变大小,希望单元格的宽高完全固定不缩放,那只要调整Grid的对齐方式,同时给列宽行高设置固定值:
<Grid x:Name="thumbGrid" ShowGridLines="True" ClipToBounds="True" HorizontalAlignment="Left" VerticalAlignment="Top"> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"/> <ColumnDefinition Width="200"/> <ColumnDefinition Width="100" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="100"/> <RowDefinition Height="200"/> <RowDefinition Height="100" /> </Grid.RowDefinitions> </Grid>
这样Grid不会随父容器拉伸,单元格的宽高就固定不变了。
内容的提问来源于stack exchange,提问作者Rohit A
相关产品推荐
相关产品推荐

