答えは「簡単ではない」と確信しています。
これはうまくいくように見えるが、ちょっと不格好なアイデアです:
StackPanelをUserControlにスローします(UserControl1
以下の例)。
このUserControlの2つのコピーをコンテナー(以下の例ではグリッド)に配置します。
a。最初のコピーを上/左に揃えて、デフォルトのサイズのままにします。このコピーは厳密に測定目的であり、可視性を非表示に設定する必要があります。
b。2番目のコピーをビューボックス内に配置します。このコピーは、ユーザーが実際に目にするものです。
MultiValueConverterでMultiBindingを使用して、2番目のUserControlの幅を調整し、ビューボックスによって展開される前に正しいアスペクト比になるようにします。
マークアップは次のとおりです。
<Grid>
<local:UserControl1 x:Name="RawControl" HorizontalAlignment="Left" VerticalAlignment="Top" Visibility="Hidden" />
<Viewbox>
<local:UserControl1>
<local:UserControl1.Width>
<MultiBinding Converter="{StaticResource WidthAdjuster}">
<Binding ElementName="RawControl" Path="ActualHeight" />
<Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualWidth" />
<Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualHeight" />
</MultiBinding>
</local:UserControl1.Width>
</local:UserControl1>
</Viewbox>
</Grid>
これがMultiValueConverterです
public class WidthAdjuster : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var rawHeight = (double)values[0];
var containerWidth = (double)values[1];
var containerHeight = (double)values[2];
var ratio = containerWidth / containerHeight;
return rawHeight * ratio;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
525x350コンテナの結果
