Есть ли WPF XAML для равномерного прилегания, но с постоянным ходом - PullRequest
3 голосов
/ 24 марта 2009

Я что нарисовать круг, который равномерно вписывается в его пространство, с постоянной толщиной сток. ViewBox обеспечивает мне равномерную посадку, но не постоянную толщину слоя.

<Viewbox Stretch="Uniform" MinHeight="10" MinWidth="10" >
    <Ellipse Height="10" Width="10" Fill="Red" StrokeThickness="1" Stroke="Yellow"/>
</Viewbox>

1 Ответ

4 голосов
/ 24 марта 2009

Если вы не укажете ширину или высоту эллипса, значениями по умолчанию будет «Авто». В сочетании со значениями по умолчанию HorizontalAlignment / VerticalAligment «Растянуть» это должно привести к тому, что эллипс «растянется» на ширину и высоту своего контейнера (с постоянной толщиной хода).

Свойства * ContentAlignment родительского контейнера могут влиять на это поведение, но, опять же, значения по умолчанию, неустановленные значения должны дать вам желаемое поведение.

Редактировать : пересмотр моего предложения, потому что я не понял, что эллипс должен оставаться кругом (не волнуйтесь, я решил взять копию «Чтение для понимания»).

Я предлагаю вам связать свойства ширины и высоты эллипса с MultiBinding свойств ActualWidth и ActualHeight родительского контейнера. Затем реализуйте «многозначный преобразователь», который будет возвращать минимальное значение из мульти-привязки.

Так что конвертер может выглядеть так:

class MinimumValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return values.Cast<double>().Min();
    }

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

И свойства эллипса могут быть связаны следующим образом:

<Window.Resources>
    <l:MinimumValueConverter x:Key="MinimumValueConverter" />
</Window.Resources>
<Ellipse Stroke="Black" StrokeThickness="1">
    <Ellipse.Width>
        <MultiBinding Converter="{StaticResource MinimumValueConverter}">
            <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualWidth" />
            <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualHeight" />
        </MultiBinding>
    </Ellipse.Width>
    <Ellipse.Height>
        <MultiBinding Converter="{StaticResource MinimumValueConverter}">
            <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualWidth" />
            <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualHeight" />
        </MultiBinding>
    </Ellipse.Height>
</Ellipse>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...