WPF Dashed Border Control

时间:2011-08-09 10:01:09

标签: c# wpf controls styles

我想创建一个继承自Border的控件,并且只允许我特定一个StrokeDashArray来划分边界线。

我不想使用'谷歌'建议的黑客,即矩形等,因为我想要边境控制给予的灵活性。

但是,我没有创建自定义控件的经验,也不知道从哪里开始?

你能指出我正确的方向

谢谢!

2 个答案:

答案 0 :(得分:12)

仍然不是最佳但是如何使用 Matt Hamilton 作为VisualBrush

的链接解决方案

使用VisualBrush与虚线RectangleSolidColorBrush

进行比较

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();
    }
}

答案 1 :(得分:0)

对不起,这有点晚了,但这是使用StrokeDashArray属性的WPF解决方案。

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,但属性仍然相同。如果您想要更多地控制破折号,请对找到的here控件使用其他“描边”属性。