Silverlight图像拉伸=肖像尺寸图像的"均匀"失败

Por*_*key 2 silverlight image stretch

我正在使用Silverlight 3.0 Image控件,设置它的Stretch属性="Uniform".除非我弄错了,否则Stretch ="Uniform"的预期行为是它应该根据需要缩放图像,保持纵横比,信箱.这适用于具有横向方向的图像,因为它们可以向上扩展以填充空间,保持纵横比而不会切断任何图像.对于具有更垂直或"纵向"方向的图像,这是完全失败的.它们不是按比例放大以适应图像控制,而是实际缩放超过高度约束,这样您只能看到图像的中间部分,顶部和底部被切掉.它好像控件只在缩放时使用宽度,忘记检查高度?

这是Image控件中的错误,还是我错过了或错误设置了属性?要重现,请查找/创建具有"纵向"宽高比(高于宽度)的图像,并使用Stretch ="Uniform"创建图像.

****更新请求的XAML******请注意,大小不明确的原因是允许全屏和缩放.

 <Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="9"/>
        <ColumnDefinition Width="30"/>
        <ColumnDefinition Width="30"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="30"/>
        <ColumnDefinition Width="50"/>
        <ColumnDefinition Width="30"/>
        <ColumnDefinition Width="9"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="30" />
    </Grid.RowDefinitions>

<Border BorderBrush="Black" Grid.Row="0" Grid.ColumnSpan="8" BorderThickness="1, 1, 1, 0">
   <Border BorderBrush="{StaticResource blackStatusMapLGB}" BorderThickness="9,9,9, 0">
      <Border BorderBrush="Gray" BorderThickness="1, 1, 1, 0">
         <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
               <MediaElement Height="Auto" Width="Auto" Visibility="Collapsed" AutoPlay="true" Stretch="Fill" MediaFailed="SilverlightMediaPlayer_MediaFailed" Name="previewMediaElement"/>
                        <Image Name="imagePreview" Stretch="Uniform"/>
          </StackPanel>
      </Border>
   </Border>
</Border>
Run Code Online (Sandbox Code Playgroud)

Kei*_*ney 6

因此,垂直StackPanel的工作方式是测量其垂直轴上具有无限大小的子项,有效地对孩子说:"你可以像你喜欢的那样高".它不会垂直约束孩子的大小(尽管它确实在水平方向上约束它).

Stretch = Uniform属性在没有明确大小设置的图像上工作的方式是:"在保持纵横比的同时,在大小限制范围内尽可能大".

现在,当您将这两者结合使用时,您的图像仅限于水平轴; 它需要水平和垂直尺寸的所有空间,以保持纵横比.

这种解释是否有助于您理解为什么您会看到您所看到的行为?

想象一下,你有一个宽高比为2:1的图像(高两倍的宽度).它具有Stretch = Uniform并且没有明确的Width/Height设置.你把它放在一个大小为100x100的StackPanel中.Image将获得100xInfinity的大小约束.它将首先在水平轴上放大并占据所有可用空间; 100像素.然后它会看到它具有2:1的宽高比,因此将垂直放大到200像素.因此,您最终会在100x100的StackPanel中找到尺寸为100x200的图像.因此,StackPanel被迫将其子节点剪切到可用空间.