基本的に、2番目の列に2つの異なるモードを設定する必要があるようです。画像全体を現在の高さで表示するのに十分なスペースがある場合は、自動にする必要があります。それ以外の場合は、最初の列に200を使用した後、残りのスペースを取得する必要があります。この種のモード切り替えを行うには、コンバーターを使用して、列の幅をバインドします。
ここでは、2つの基本的な入力があります。グリッドで使用可能な合計サイズと、画像の目的の幅です。両方が必要なので、IMultiValueConverterが必要になります。上記のスイッチを計算するための基本的な実装は次のとおりです。
public class AutoColumnConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double imageWidth = values.OfType<double>().FirstOrDefault();
double gridWidth = values.OfType<double>().ElementAtOrDefault(1);
int minWidth = System.Convert.ToInt32(parameter);
double availableSpace = gridWidth - minWidth;
if (imageWidth > availableSpace)
return new GridLength(availableSpace, GridUnitType.Pixel);
return new GridLength(0, GridUnitType.Auto);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
これを使用するには、グリッド自体の代わりにバインドできる別の要素でグリッドをラップする必要があります。これは、基本的にグリッド自体が使用できるスペースの周りにあり、2つの定義された列でさらに拡張しようとします。ここでは、Source.Widthを使用して、画像の目的の幅を見つけています。アスペクト比を重視する場合、または高さも考慮したい場合は、調整することをお勧めします。
<Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MinWidth="200" />
<ColumnDefinition>
<ColumnDefinition.Width>
<MultiBinding ConverterParameter="200">
<MultiBinding.Converter>
<local:AutoColumnConverter/>
</MultiBinding.Converter>
<Binding ElementName="Img" Path="Source.Width"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Border}}" Path="ActualWidth"/>
</MultiBinding>
</ColumnDefinition.Width>
</ColumnDefinition>
</Grid.ColumnDefinitions>
<Image x:Name="Img" Grid.Column="1" Stretch="Uniform" StretchDirection="DownOnly"
Source="..."/>
</Grid>
</Border>