gpt4 book ai didi

WPF 不需要的网格分割器行为

转载 作者:行者123 更新时间:2023-12-02 08:59:09 24 4
gpt4 key购买 nike

我有一个包含 3 列的简单网格(其中一列包含网格分割器)。当调整网格大小并且左列达到其最小宽度时,它不会不执行任何操作,而是会增加右列的宽度。谁能帮我阻止这个吗?

我无法设置右列的最大宽度,因为网格本身也会调整大小。

这是一些显示问题的示例代码。调整大小时,将鼠标移到红色区域上:

XAML:

<Grid DockPanel.Dock="Top" Height="200">
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="200" Width="*" />
<ColumnDefinition Width="3" />
<ColumnDefinition MinWidth="120" Width="240" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Rectangle Fill="Red" Grid.Row="0" Grid.Column="0" />
<DockPanel LastChildFill="True" Grid.Row="0" Grid.Column="2" >
<Rectangle DockPanel.Dock="Right" Width="20" Fill="Blue" />
<Rectangle Fill="Green" />
</DockPanel>
<GridSplitter Background="LightGray" Grid.Row="0" Grid.Column="1" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</Grid>

最佳答案

我知道这有点晚了,但我刚刚遇到了这个问题,这是我的解决方案。不幸的是它不够通用,它只适用于具有两列的网格,但它可能可以进一步适应。但是,它解决了所描述的问题和我自己的问题,所以这里是:

该解决方案包括黑客或解决方法,无论您如何调用它。您不必为左列和右列声明 MinWidth,而是为第一列声明 MinWidth 和 MaxWidth。这意味着 GridSplitter 不会移动到定义位置的右侧。到目前为止,一切都很好。

下一个问题是,如果我们有一个可调整大小的容器(在我的例子中是窗口),这还不够。这意味着我们无法将左列放大到我们想要的程度,即使第二列可能有足够的空间。幸运的是,有一个解决方案:绑定(bind) Grid ActualWidth 并使用加法转换器。转换器参数实际上是右列所需的 MinWidth,显然是负值,因为我们需要从网格宽度中减去它。您也可以使用 SubtractConvertor,但这取决于您。

这是 xaml 和代码:

<Grid Background="{DynamicResource MainBackground}" x:Name="MainGrid" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" MinWidth="100" MaxWidth="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=Grid}, Converter={Converters:AdditionConverter}, ConverterParameter=-250}" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<GridSplitter Width="3" VerticalAlignment="Stretch" Grid.Column="0"/>
<!-- your content goes here -->
</Grid>

和转换器:

[ValueConversion(typeof(double), typeof(double))]
public class AdditionConverter : MarkupExtension, IValueConverter
{
#region IValueConverter Members

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double dParameter;
if (targetType != typeof(double) ||
!double.TryParse((string)parameter, NumberStyles.Any, CultureInfo.InvariantCulture, out dParameter))
{
throw new InvalidOperationException("Value and parameter passed must be of type double");
}
var dValue = (double)value;
return dValue + dParameter;
}

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

#endregion

#region Overrides of MarkupExtension

/// <summary>
/// When implemented in a derived class, returns an object that is set as the value of the target property for this markup extension.
/// </summary>
/// <returns>
/// The object value to set on the property where the extension is applied.
/// </returns>
/// <param name="serviceProvider">Object that can provide services for the markup extension.
/// </param>
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}

#endregion
}

希望这对您有所帮助,

米哈伊·德雷博特

关于WPF 不需要的网格分割器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2625477/

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