似乎您想要的是第二列有两种不同的模式。当足够的空间可以显示整个图像时,它应该是自动的;否则,它应该只获取第一列占用200后剩余的空间。为了进行这种模式切换,您可以使用转换器并绑定列的宽度。
您需要两个基本输入:网格可用的总大小和图像的期望宽度。由于您需要它们两个,因此您需要一个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();
}
}
要使用此功能,您需要将Grid包装在另一个元素中,而不是直接绑定到Grid本身,这样它就可以欺骗可用空间并尝试通过两个定义的列进一步拉伸。在这里,我使用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="}" Path="ActualWidth"/>
</MultiBinding>
</ColumnDefinition.Width>
</ColumnDefinition>
</Grid.ColumnDefinitions>
<Image x:Name="Img" Grid.Column="1" Stretch="Uniform" StretchDirection="DownOnly"
Source="..."/>
</Grid>
</Border>