将宽度绑定到实际高度 - 仅部分工作



我正在尝试将图像的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>

现在,这部分有效 - 将项目添加到集合后导航回页面似乎有效。

但是任何加载或随后导航到页面都会使图像不显示。

有趣的是,加载后,图像的实际宽度不是实际高度。它更少。而且网格的宽度甚至更小...这简直太奇怪了...

favImage1.实际宽度

185.13514709472656

收藏夹图像1.实际身高

274,0

(FrameworkElement)favImage1.Parent).实际宽度

138,0

正确的方法是什么?

如果我理解正确,您希望确保您的图像保持方形。

我认为这不是在 xaml 中操作图像的正确方法。我宁愿将图像包装在Border中并将Border的大小设置为修复,然后将图像Stretch属性更改为UniformToFill

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

另一种选择是使用 ViewBox 来包装映像。在这里,您可以看到 Stretch 属性的不同值的影响:

ViewBox.Stretch Property

最新更新