gpt4 book ai didi

wpf - 固定大小的 GridSplitter MinWidth

转载 作者:行者123 更新时间:2023-12-02 03:12:47 27 4
gpt4 key购买 nike

我有一个由 GridSplitter 分隔的 2 列的网格,使用以下 XAML 代码:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" MinWidth="20" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" MinWidth="100" />
</Grid.ColumnDefinitions>

<Rectangle Fill="Blue" />
<GridSplitter Grid.Column="1" Background="LightGray" HorizontalAlignment="Stretch" />
<Rectangle Fill="Yellow" Grid.Column="2" />
</Grid>

问题:右侧列的 MinWidth 被忽略

  • 当页面加载时,我肯定需要第一列的宽度为“100px”,所以它不能被*调整大小。
  • 我不想在第一列上设置 MaxWidth

*我知道这个问题以前已经解决过,但它总是建议将列大小设置为 * 或在第一列上设置 maxWidth...我不希望这样。

<小时/>

找到了一个解决方案,但是它很丑! :p,任何人都有更干净的方法来实现我想要的...无代码(如果可能)?

private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
var g = (Grid)sender;

Double maxW = e.NewSize.Width - g.ColumnDefinitions[2].MinWidth - g.ColumnDefinitions[1].ActualWidth;
g.ColumnDefinitions[0].MaxWidth = maxW;
}

最佳答案

基本问题是,网格分割器的工作原理是调整左列的宽度,并假设右列将星形大小来适应剩余空间。

这意味着您要解决的问题实际上是“如何限制左列的最大宽度,以便右列不会变得太小?”。这基本上就是您的代码示例正在做的事情。

如果您想要一个更可移植的解决方案,可以在 XAML 中实现,请创建一个 Silverlight behavior可以应用于网格(如下所示)。它将附加到父网格的 SizeChanged 事件,并且几乎完全执行您的代码片段的操作,但作为一种行为,您可以将它们拖放到 Blend 中或将它们附加到 XAML 中。

这是我为您整理的示例行为(基于您自己的代码):

MinWidthSplitterBehavior.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;

namespace GridSplitterMinWidth
{
public class MinWidthSplitterBehavior : Behavior<Grid>
{
public Grid ParentGrid { get; set; }

protected override void OnAttached()
{
base.OnAttached();
ParentGrid = this.AssociatedObject as Grid;
ParentGrid.SizeChanged += parent_SizeChanged;
}

void parent_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (ParentGrid.ColumnDefinitions.Count == 3)
{
Double maxW = e.NewSize.Width - ParentGrid.ColumnDefinitions[2].MinWidth -
ParentGrid.ColumnDefinitions[1].ActualWidth;
ParentGrid.ColumnDefinitions[0].MaxWidth = maxW;
}
}

protected override void OnDetaching()
{
base.OnDetaching();
if (ParentGrid != null)
{
ParentGrid.SizeChanged -= parent_SizeChanged;
}
}
}
}

并像这样使用它:

<UserControl x:Class="GridSplitterMinWidthApp.MainPage"
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:GridSplitterMinWidth="clr-namespace:GridSplitterMinWidth"
xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" MinWidth="20" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" MinWidth="100" />
</Grid.ColumnDefinitions>
<interactivity:Interaction.Behaviors>
<GridSplitterMinWidth:MinWidthSplitterBehavior/>
</interactivity:Interaction.Behaviors>
<Rectangle Fill="Blue" />
<Controls:GridSplitter Grid.Column="1" Background="LightGray" HorizontalAlignment="Stretch">
</Controls:GridSplitter>
<Rectangle Fill="Yellow" Grid.Column="2" />
</Grid>
</Grid>
</UserControl>

关于wpf - 固定大小的 GridSplitter MinWidth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com