天天看點

WPF開發-Label自定義背景-Decorator

首先在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" />
           

運作效果

WPF開發-Label自定義背景-Decorator