Каков наилучший способ установить высоту моего элемента управления в процентах от его ширины в WPF? - PullRequest
0 голосов
/ 12 февраля 2020

Я бы хотел установить высоту моего элемента управления WPF в процентах от его ширины.

Я знаю, что Dev Express делает это простым благодаря DXBinding.

<Button Height="{DXBinding '@Self.ActualWidth*.65'}" />

Что лучший способ добиться этого в ванильном WPF? Одна мысль у меня была в том, чтобы использовать конвертер.

Мне нужно иметь возможность передавать ширину и целочисленное значение элемента управления (для масштабирования) в качестве параметров. Как будет выглядеть мое определение XAML?

XAML

<Button Height="{Binding Path=MyWidth, Mode=OneWay,
                        Converter={StaticResource MyConverter}, 
                        ConverterParameter=65}" />

Код позади

public object Convert(object value, Type targetType, object parameter, 
System.Globalization.CultureInfo culture)
{
    string parameterString = parameter as string;

    // value - contains the width of the control

    // parameter contains the desired scale percentage 
}

Это жизнеспособно? Есть ли лучший / более чистый способ сделать это?

Спасибо, JohnB

1 Ответ

0 голосов
/ 12 февраля 2020

Вы должны привязать к Self.ActualHeigth свойство как

<Button Height="{Binding RelativeSource={RelativeSource Self}, 
                         Path=ActualWidth,
                         Converter={StaticResource DoublePercentageConverter}, 
                         ConverterParameter=0.65}" />

и здесь конвертер

public class DoublePercentageConverter : IValueConverter
{
    public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        var factor = parameter switch
        {
            string v => double.TryParse( v, NumberStyles.Any, CultureInfo.InvariantCulture, out var d ) ? d : 1.0,
            int v => System.Convert.ToDouble( v ),
            decimal v => System.Convert.ToDouble( v ),
            double v => v,
            _ => 1.0
        };

        return (double)value * factor;
    }

    public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
    {
        throw new NotImplementedException();
    }
}
...