私はこれが少し遅いことを知っています、しかし私はちょうどこの問題に遭遇します、そしてここに私の解決策があります。残念ながら、それは十分に一般的ではなく、2列のグリッドに対してのみ機能しますが、おそらくさらに適応させることができます。しかし、それは記述された問題と私自身の問題を解決するので、ここに行きます:
解決策はハックまたは回避策で構成されていますが、それを呼び出したいと思います。左と右の両方の列にMinWidthを宣言する代わりに、最初の列にMinWidthとMaxWidthを宣言します。これは、GridSplitterが定義された場所の右側に移動しないことを意味します。ここまでは順調ですね。
次の問題は、サイズ変更可能なコンテナ(私の場合はウィンドウ)がある場合、これでは不十分であるということです。これは、2番目の列に十分なスペースがある場合でも、左側の列を必要なだけ拡大できないことを意味します。幸いなことに、解決策があります。グリッドのActualWidthにバインドし、加算コンバーターを使用します。コンバーターパラメータは、グリッド幅から減算する必要があるため、実際には右側の列に必要な最小幅であり、明らかに負の値になります。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
}
これがお役に立てば幸いです。
ミハイ・ドレボット