這聽起來像你想要的基本上有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();
}
}
要使用這個你需要用你的網格中,你可以結合的,而不是網格本身,這將從根本上撒謊可用空間的另一個元素它並嘗試用兩個定義的列進一步擴展。這裏我使用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>
接下來的問題是:由於我不知道窗口大小決定之前的總寬度(600),因此如何計算網格的最大寬度?我想我可以爲此編寫一個轉換器,但如果有更直接的方法,它會好很多... – aKzenT
我不知道,但我會按照這個問題。我可以刪除,如果你覺得它傷害你得到更好的答案的機會。我也不喜歡轉換器。 –
請不要刪除答案。我想我已經有一個想法,如果沒有基於你的版本的轉換器解決這個問題。 – aKzenT