Binding Width to ActualHeight - работает только частично

Я пытаюсь связать изображение Width к его ActualHeight (высота определяется макетом, и я хочу, чтобы он был квадратным - если есть лучший способ сделать это, я хотел бы услышать).

Это мой XAML:

<Grid Grid.Row="1" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="auto"/>
    <ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="*"/>
    <RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Image x:Name="favImage1" Source="{Binding Controller.FailStorage.FailRoamingStorage.Favorites[0].ImageUri}" Grid.Column="0" Grid.Row="0" Style="{StaticResource FavoriteImageStyle}" Width="{Binding ActualHeight, ElementName=favImage1, Mode=OneWay}"/>
</Grid>

Стиль определяется так:

    <Style x:Key="FavoriteImageStyle" TargetType="Image">
        <Setter Property="Stretch" Value="UniformToFill"/>
        <Setter Property="Margin" Value="0,0,12,12"/>
        <Setter Property="VerticalAlignment" Value="Stretch"></Setter>
    </Style>

Теперь это работает частично - кажется, что переход обратно на страницу после добавления элементов в коллекцию работает.

Но любая загрузка или последующие переходы на страницу заставляют изображение не показываться.

Интересно, что после загрузки ActualWidth изображения НЕ будет ActualHeight. Это меньше. А ширина Решетки еще меньше... Что просто странно...

favImage1.ActualWidth

+185,13514709472656

favImage1.ActualHeight

274,0

((FrameworkElement) favImage1.Parent).ActualWidth

138,0

Как правильно это сделать?

1 ответ

Если я вас правильно понимаю, вы хотели бы убедиться, что ваше изображение остается квадратным.

Я думаю, что это неправильный способ манипулировать изображением в xaml. Я бы предпочел завернуть изображение в Border и установить BorderРазмер, чтобы что-то исправить, а затем изменить изображение Stretch собственность на UniformToFill:

<Border Width="110" Height="110">
    <Image Source="my.jpg" Stretch="UniformToFill" />
</Border>

Другой вариант заключается в использовании ViewBox обернуть изображение. Здесь вы можете увидеть влияние различных значений для Stretch имущество:

Свойство ViewBox.Stretch

Другие вопросы по тегам