WPF重新定义GroupBox新样式

本文详细介绍了如何在WPF中根据不同场景重新定义控件样式,包括在资源文件中按需定义、App.xaml中全局样式绑定以及使用Template和Path等元素创建自定义控件外观。
摘要由CSDN通过智能技术生成

 先上图,看效果

是不是比原来的样式好看很多,这里面牵涉到了很多的常用功能,拿出来做个分享。

一、根据使用情况来定义控件的样式代码放置的位置

   首先就是WPF控件中的控件样式改变,这是WPF中特有的,在界面UI直接可以更改,而不需要像Winforms一样写很多的代码来实现,那控件的样式该如何重新定义呢?

1.界面上有大量相同的控件使用

仅仅在一个页码上,并且有多次使用的情况,可以直接在页面上去用<Window.Resources>来重新定义;

2.相同的控件,不同的样式 & 在不同的界面上均有使用

页面上有相同的控件,不同的样式时或者在不同的界面上会用到相同的控件样式时,避免我们多次是书写,可以在我们程序中的App.xaml文件中来定义不同的样式,在使用该样式时进行样式绑定即可;在App.xaml中需要使用<Style TargetType="GroupBox" x:Key="GroupBoxStyle > x:Key关键字来实现后期的样式绑定,使用时Style="{StaticResource GroupBoxStyle }"即可。

二、重新定义控件的样式

1.针对目标

 <Style TargetType="GroupBox">  直接通过Style样式来重新画,后面TargetType“目标”直接对应我们需要更改的控件,比如Textbox,Button,CheckBox,TextBlock等等,在WPF中可以用到的控件均可以重新定义;

2.针对选定目标的属性

<Setter Property="Foreground" Value="#2a2a2a"/>  接着在通过Setter设置,Property 属性  Value值所对应的关系写即可,Property 属性主要是你所针对目标所有的属性均可定义,Value  很好理解即是你需要的对应结果;

3.模版定义

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="GroupBox">

通过 Template  模版的定义来实现我们的控件模版发生改变。

三、代码实现,代码分析

<Window.Resources>
    <Style TargetType="GroupBox">
        <Setter Property="Margin" Value="10,5"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="GroupBox">
                    <Grid>
                        <Polyline Points="0 30,0 10,10 0,30 0" Stroke="#2a2a2a" StrokeThickness="1" VerticalAlignment="Top" HorizontalAlignment="Left"/>
                        <Ellipse Width="4" Height="4" VerticalAlignment="Top" HorizontalAlignment="Left"
                                 Fill="#2a2a2a" Margin="24,-2,0,0"/>
                        <Ellipse Width="4" Height="4" VerticalAlignment="Top" HorizontalAlignment="Left"
                                 Fill="#2a2a2a" Margin="-2,24,0,0"/>
                        <Path Data="M0 0,3 3,30 3,33 0,68 0,73 7,78 7,78 10M8 0,25 0" Stroke="#2a2a2a" 
                              VerticalAlignment="Top" HorizontalAlignment="Right"/>
                        <Polyline Points="0,0 0,15 10,15" Stroke="#2a2a2a"  VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
                        <Polyline Points="10,0 0,10" Stroke="#2a2a2a"  VerticalAlignment="Bottom" HorizontalAlignment="Right"/>
                        <Polygon Points="0,7 7 7 7 0" Fill="#2a2a2a" VerticalAlignment="Bottom" HorizontalAlignment="Right"/>
                        <Border BorderBrush="#2a2a2a" BorderThickness="0,1,0,0" VerticalAlignment="Top"
                                Margin="30,-0.5,78,0"/>
                        <Border BorderBrush="#2a2a2a" BorderThickness="0,0,1,0" HorizontalAlignment="Right" Margin="0,10"/>
                        <Border BorderBrush="#2a2a2a" BorderThickness="0,1,0,0" VerticalAlignment="Bottom" Margin="10,0"/>
                        <Border BorderBrush="#2a2a2a" BorderThickness="0,0,1,0" HorizontalAlignment="Left" Margin="-0.5,15"/>

                        <Path Data="M0 0,3 0,5 4,3 8,0 8,3 4" Fill="#2a2a2a" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,13"/>
                        <Path Data="M0 0,3 0,5 4,3 8,0 8,3 4" Fill="#aaaaaa" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="16,13"/>
                        <TextBlock Text="{TemplateBinding Header}" Foreground="#2a2a2a" VerticalAlignment="Top" FontSize="13"
                                   HorizontalAlignment="Left" Margin="25,8"/>
                        <ContentPresenter/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</Window.Resources>

上面GroupBox的样式即是通过此代码实现的。

我们来进行简单的分析,角落这边都是通过折线的方式来记性画图的,自然就用到了Polyline 。

Polyline 是一种用于绘制多条直线段连接而成的图形的控件。可以使用 Polyline 控件来创建各种形状,例如折线、多边形等。

右下角有一个三角形,使用到了Polygon 控件,Polygon 是一种用于绘制多边形的图形控件。Polygon 可以闭合形成一个封闭的多边形。

Polygon 与Polyline 不同,Polygon 会自动将最后一个点与第一个点连接起来,形成一个封闭的多边形。

当然他们也有很多相同的属性,Stroke 属性用于指定线条颜色,StrokeThickness 属性用于指定线条粗细。

特性PolylinePolygon
绘制形状由多条直线段连接而成的开放图形由多条直线段连接而成的封闭图形
闭合性不闭合,最后一个点不会与第一个点连接闭合,最后一个点会与第一个点连接
填充不支持填充支持填充
线条颜色可以设置线条颜色可以设置线条颜色
线条粗细可以设置线条粗细可以设置线条粗细
点集合通过 Points 集合定义各个点的坐标通过 Points 集合定义各个顶点的坐标
布局方式无法形成封闭的图形形成封闭的多边形

 右上角有一个很复杂的线路,是用Path来编写的,Path的功能非常的强大,可以画出各种图形,甚至上面的所有图像都可以进行用Path来画,但坐标点会很多,所以直线我们直接用border来画更快捷方便一些。

语法用途示例
M移动到(Move To)指定的坐标点M100,100
L画直线(Line To)到指定的坐标点L200,200
H画水平线(Horizontal Line To)到指定的 X 坐标点H300
V画垂直线(Vertical Line To)到指定的 Y 坐标点V150
C画三次贝塞尔曲线(Cubic Bezier Curve)到指定的坐标点C100,200 200,200 200,300
S画平滑三次贝塞尔曲线(Smooth Cubic Bezier Curve)到指定的坐标点S300,100 400,100
Q画二次贝塞尔曲线(Quadratic Bezier Curve)到指定的坐标点Q150,150 200,100
T画平滑二次贝塞尔曲线(Smooth Quadratic Bezier Curve)到指定的坐标点T300,200
A画椭圆弧(Arc)到指定的坐标点A50,50 45 1 0 1 350,100
Z封闭路径(Close Path),将当前点与起始点连接起来形成封闭路径Z

下面是Path的语法说明,可以自己的实验画出不同的图形; 

<TextBlock Text="{TemplateBinding Header}" Foreground="#2a2a2a" VerticalAlignment="Top" FontSize="13"
           HorizontalAlignment="Left" Margin="25,8"/>

最后通过 TextBlock来绑定GroupBox的表头即可完成最终的效果。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值