听起来您想要的基本上是为您的第二列提供两种不同的模式。当整个图像有足够的空间以当前高度显示时,它应该是自动的,否则它应该在第一列取 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();
}
}
要使用它,您需要将 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="{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>