开发者社区> nurmemet> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

WPF开发-Label自定义背景-Decorator

简介: 首先在App.xaml文件当中添加样式和模板
+关注继续查看

首先在App.xaml文件当中添加样式和模板

        <!--编辑器通用主题样式--> 
        <Style x:Key="nu_editor_style">
            <Setter Property="Control.Padding" Value="12"></Setter>
            <Setter Property="Control.Background" Value="#FFC1EDF7"></Setter>
            <Setter Property="Control.BorderBrush" Value="#FFA0A2A4"></Setter>
            <Setter Property="Control.BorderThickness" Value="8"></Setter>
            <Setter Property="Control.ClipToBounds" Value="True"></Setter>
        </Style>
        <!--Label 控件模板-->
        <ControlTemplate x:Key="nu_editor_label_template" TargetType="Label" >
            <lib:CustomDrawnDecorator BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"     
           BorderThickness="{TemplateBinding BorderThickness}">

                <ContentPresenter Margin="{TemplateBinding Padding}"
                     HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                     VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                     ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
                     Content="{TemplateBinding ContentControl.Content}"
                     RecognizesAccessKey="True" />
            </lib:CustomDrawnDecorator>
        </ControlTemplate>

下面是Decorator的代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfApp1
{
    public class CustomDrawnDecorator : Decorator
    {

        double arrowLen = 30d;
        static Thickness defaultBorderThickness = new Thickness(4d);

        public static  DependencyProperty BorderBrushProperty =
           DependencyProperty.Register("BorderBrush", typeof(Brush), typeof(CustomDrawnDecorator), new PropertyMetadata(Brushes.Gray));

        public static  DependencyProperty BorderThicknessProperty =
           DependencyProperty.Register("BorderThickness", typeof(Thickness), typeof(CustomDrawnDecorator), new PropertyMetadata(defaultBorderThickness));

        public static DependencyProperty BackgroundProperty=
        DependencyProperty.Register("Background", typeof(Brush), typeof(CustomDrawnDecorator)
                , new FrameworkPropertyMetadata(Brushes.RosyBrown));

        static CustomDrawnDecorator()
        {

            


        }

        public Brush Background
        {
            get
            {
                return (Brush)GetValue(BackgroundProperty);
            }
            set
            {
                SetValue(BackgroundProperty, value);
            }
        }

        public Brush BorderBrush
        {
            get
            {
                return (Brush)GetValue(BorderBrushProperty);
            }
            set
            {
                SetValue(BorderBrushProperty, value);
            }
        }

        public Thickness BorderThickness
        {
            get { return (Thickness)GetValue(BorderThicknessProperty); }
            set { SetValue(BorderThicknessProperty, value); }
        }

        protected override void OnRender(DrawingContext dc)
        {
            base.OnRender(dc);


            Rect bounds = new Rect(0, 0, base.ActualWidth, base.ActualHeight);
            Pen p = new Pen(BorderBrush,getBorderThickness());
            //填充背景
            dc.DrawRectangle(Background, null, bounds);
            //左长线
            dc.DrawLine(p, new Point(getBorderThickness() / 2, 0), new Point(getBorderThickness() / 2, ActualHeight));
            //右长线
            dc.DrawLine(p, new Point(ActualWidth - getBorderThickness() / 2, 0), new Point(ActualWidth - getBorderThickness() / 2, 
            ActualHeight));
            //左上短线
            dc.DrawLine(p, new Point(0, getBorderThickness() / 2), new Point(arrowLen, getBorderThickness() / 2));
            //右上短线
            dc.DrawLine(p, new Point(ActualWidth - arrowLen, getBorderThickness() / 2), new Point(ActualWidth, getBorderThickness() / 
            2));
            //左下短线
            dc.DrawLine(p, new Point(0, ActualHeight - getBorderThickness() / 2), new Point(arrowLen, ActualHeight - 
            getBorderThickness() / 2));
            //右下短线
            dc.DrawLine(p, new Point(ActualWidth - arrowLen, ActualHeight - getBorderThickness() / 2), new Point(ActualWidth, 
            ActualHeight - getBorderThickness() / 2));

            //dc.DrawRectangle(Background, p, bounds);
            //dc.DrawLine(new Pen(Background, getBorderThickness() / 2), new Point(arrowLen, getBorderThickness() / 4), new 
            //Point(ActualWidth - arrowLen, getBorderThickness() / 4));
            //dc.DrawLine(new Pen(Background, getBorderThickness() / 2), new Point(arrowLen, ActualHeight - getBorderThickness() / 4), 
            //new Point(ActualWidth - arrowLen, ActualHeight - getBorderThickness() / 4));


        }

        public double DpiScaleX { get; }
        private double getBorderThickness()
        {
            return BorderThickness.Right != 0 ? BorderThickness.Right : defaultBorderThickness.Right;
        }
       


    }
}

然后在 mainWindow.xaml文件当中tianji添加Label控件

  <Label Width="300" Height="100"  Style="{StaticResource nu_editor_style}" Template="{StaticResource nu_editor_label_template}"  Content="我是Label控件" FontSize="17"  HorizontalAlignment="Left" Margin="180,185,0,0" VerticalAlignment="Top" />

运行效果
image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
WPF中实现多选ComboBox控件
原文:WPF中实现多选ComboBox控件 在WPF中实现带CheckBox的ComboBox控件,让ComboBox控件可以支持多选。 将ComboBox的ItemsSource属性Binding到一个Book的集合, public class Book { ...
2812 0
WPF 4 DataGrid 控件(基本功能篇)
原文:WPF 4 DataGrid 控件(基本功能篇)      提到DataGrid 不管是网页还是应用程序开发都会频繁使用。通过它我们可以灵活的在行与列间显示各种数据。本篇将详细介绍WPF 4 中DataGrid 的相关功能。
1132 0
WPF 控件库——仿制Windows10的进度条
原文:WPF 控件库——仿制Windows10的进度条 一、其实有现成的   先来看看Windows10进度条的两种模式:       网上有不少介绍仿制Windows10进度条的文章,也都实现了不错的效果。
1117 0
WPF 控件库——仿制Chrome的ColorPicker
原文:WPF 控件库——仿制Chrome的ColorPicker 一、观察   项目中的一个新需求,需要往控件库中添加颜色拾取器控件,因为公司暂时还没有UI设计大佬入住,所以就从网上开始找各种模样的ColorPicker,找来找去我就看上了谷歌浏览器自带的,它长这个样:         看上去不错,可以搞!搞之前得观察一下这里面可能的一些坑。
1192 0
WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox
原文:WPF自定义控件与样式(8)-ComboBox与自定义多选控件MultComboBox 一.前言   申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接。
1822 0
在WPF的WebBrowser控件中抑制脚本错误
原文:在WPF的WebBrowser控件中抑制脚本错误 今天用WPF的WebBrowser控件的时候,发现其竟然没有ScriptErrorsSuppressed属性,导致其到处乱弹脚本错误的对话框,在MSDN上找到了如下解决方案:  1 static void SuppressScriptE...
918 0
转 8天入门wpf—— 第六天 细说控件
WPF中的控件大体上分为四类   内容控件   ContentControl直接从Control类中派生出来,内容控件的最大特征是含有一个Content属性,Content属性的类型是Object,因此内容控件可以是.Net的任何类。
783 0
WPF下可编辑Header的Tab控件实现
介绍 有这样一个需求,当用户双击Tab控件Header区域时, 希望可以直接编辑。对于WPF控件,提供一个ControlTemplate在加上一些Trigger就可以实现。效果如下: 代码 首先,我们需要给Tab Header设计一个ControlTemplate。
935 0
+关注
nurmemet
阅读博客遇到的任何问题可以加微信2335515050咨询
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载