0

私は動作する以下のコードを持っています。最小描画幅を20ピクセル幅に正しく保ちます。ただし、MinHeight値を設定する必要があります。MinHeight値で現在の高さ/幅の比率を維持したい。それ、どうやったら出来るの?

<Grid MinWidth="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type c:IWorldAndScreen}}, Path=MetersPerPixel, Converter={StaticResource multiplier}, ConverterParameter=20}">
    <Grid.Width>
        <MultiBinding Converter="{StaticResource summation}">
            <Binding Path="Front" />
            <Binding Path="Back" />
        </MultiBinding>
    </Grid.Width>
    <Grid.Height>
        <MultiBinding Converter="{StaticResource summation}">
            <Binding Path="Left" />
            <Binding Path="Right" />
        </MultiBinding>
    </Grid.Height>
...
</Grid>
4

1 に答える 1

0

これが私が思いついたものです:

<Grid.MinHeight>
    <!-- height/width * actualWidth -->
    <MultiBinding Converter="{StaticResource divMulAdd}">
        <Binding RelativeSource="{RelativeSource Self}" Path="Height"/>
        <Binding RelativeSource="{RelativeSource Self}" Path="Width"/>
        <Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/>
    </MultiBinding>
</Grid.MinHeight>

このコンバーターと組み合わせると:

public class DivMulAddMultiConverter : IMultiValueConverter
    {
        #region Implementation of IMultiValueConverter

        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (targetType != typeof(double)) throw new ArgumentException("Expected a target type of Double", "targetType");
            if (values == null || values.Length <= 0) return 0.0;

            var cur = System.Convert.ToDouble(values[0]);
            if(values.Length > 1)
                cur /= System.Convert.ToDouble(values[1]);
            if(values.Length > 2)
                cur *= System.Convert.ToDouble(values[2]);
            for(int i = 3; i < values.Length; i++)
                cur += System.Convert.ToDouble(values[i]);

            return cur;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
于 2013-02-25T22:20:12.160 に答える