WPF пунктирный пограничный контроль - PullRequest
6 голосов
/ 09 августа 2011

Я хочу создать элемент управления, который наследуется от Border и просто позволяет мне указать StrokeDashArray, чтобы разбить границу.

Я не хочу использовать предложенные в Google хаки, то есть прямоугольники и т. Д., Так как мне нужна гибкость, которую дает пограничный контроль.

Однако у меня нет опыта создания пользовательских элементов управления, и я не знаю, с чего начать?

Не могли бы вы указать мне правильное направление

Спасибо!

Ответы [ 2 ]

12 голосов
/ 09 августа 2011

Все еще не оптимально, но как насчет использования решения по ссылке Мэттом Гамильтоном в качестве VisualBrush

Сравнения с использованием VisualBrush с пунктирными Rectangle и SolidColorBrush

enter image description here

<Border BorderThickness="3,2,1,0" CornerRadius="10">
    <Border.BorderBrush>
        <VisualBrush>
            <VisualBrush.Visual>
                <Rectangle StrokeDashArray="1.0 1.0"
                           Stroke="Red"
                           StrokeThickness="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}},
                                                     Path=BorderThickness,
                                                     Converter={StaticResource ThicknessMaxConverter}}"
                           RadiusX="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=CornerRadius.TopRight}"
                           RadiusY="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=CornerRadius.BottomLeft}"
                           Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualWidth}"
                           Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualHeight}"/>
            </VisualBrush.Visual>
        </VisualBrush>
    </Border.BorderBrush>
</Border>

ThicknessMaxConverter

public class ThicknessMaxConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Thickness thickness = (Thickness)value;
        double horizontalMax = Math.Max(thickness.Left, thickness.Right);
        double verticalMax = Math.Max(thickness.Top, thickness.Bottom);
        return Math.Max(horizontalMax, verticalMax);
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
0 голосов
/ 31 мая 2016

Извините, это немного поздно, но вот решение для WPF, использующее свойство StrokeDashArray .

ellipse Ellipse = new Ellipse();
/*code to change ellipse size, margin, color, etc*/
ellipse.StrokeDashArray=new DoubleCollection(new double[] {4, 3})
//First number is the dash length, second number the dash gap

Я понимаю, что это код на C #, а не XML, но свойство остается тем же. Если вы хотите больше контроля над своими штрихами, используйте другие свойства «Штрих» для найденных элементов управления здесь .

...