zoukankan      html  css  js  c++  java
  • WPF装饰器 安静点

      

    顾名思义就是装饰用的,也就是说不改变原有的控件结构,但可以为控件添加一些新的功能,或是为控件的显示外观增加些东西。 我们以MSDN中的代码为例(装饰器概述)做延伸:

    xaml:

    <UserControl x:Class="MyWpf.MyAdorner"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:MyWpf"
                 mc:Ignorable="d" 
                 d:DesignHeight="450" d:DesignWidth="800">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
                <RowDefinition Height="100"></RowDefinition>
            </Grid.RowDefinitions>
            
            <Button Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"  x:Name="show" Width="200" Height="100"  ></Button>
            <StackPanel Grid.Row="1"  HorizontalAlignment="Center"  Orientation="Horizontal">
                <Button    Content="增加装饰器" x:Name="add" Width="77" Height="30"  HorizontalAlignment="Center"   Click="Add_Click"></Button>
                <Button    Content="移除装饰器" HorizontalAlignment="Center"
    x:Name="delete" Height="30" Click="Delete_Click" Margin="2,0,0,0" Width="89"/> </StackPanel> </Grid> </UserControl>

    后台代码:

    namespace MyWpf
    {
        /// <summary>
        /// MyAdorner.xaml 的交互逻辑
        /// </summary>
        public partial class MyAdorner : UserControl
        {
            public MyAdorner()
            {
                InitializeComponent();
            }
    
            private void Add_Click(object sender, RoutedEventArgs e)
            {
                //拿到被装饰的控件装饰层
                var layer = AdornerLayer.GetAdornerLayer(show);
                //将装饰的信息放到被装饰控件的装饰层中
                layer.Add(new TestAdorner(show));
            }
    
            private void Delete_Click(object sender, RoutedEventArgs e)
            {
                var layer = AdornerLayer.GetAdornerLayer(show);
                var arr = layer.GetAdorners(show);
                if (arr != null)
                {
                    //不一定有多少装饰器,所以全部删除
                    for (int i = arr.Length - 1; i >= 0; i--)
                    {
                        layer.Remove(arr[i]);
                    }
                }
            }
        }
    
        /// <summary>
        /// 自定义的装饰器类
        /// </summary>
        public class TestAdorner : Adorner
        {
            public TestAdorner(UIElement adornedElement) : base(adornedElement)
            {
            }
    
            // A common way to implement an adorner's rendering behavior is to override the OnRender
            // method, which is called by the layout system as part of a rendering pass.
            protected override void OnRender(DrawingContext drawingContext)
            {
                Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
    
                // Some arbitrary drawing implements.
                SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
                renderBrush.Opacity = 0.2;
                Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);
                double renderRadius = 5.0;
    
                // Draw a circle at each corner.
                drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
                drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
                drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
                drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius);
            }
    
        }
    
    }

    结果:

      

  • 相关阅读:
    基本的CRUD操作
    java.lang.IllegalStateException: Cannot forward after response has been committed的一个情况解决方法
    一个解决过程:Servlet [某路径xxx] in web application [/项目xxx] threw load() exception和java.lang.ClassNotFoundException XXX
    卸载时候出现: windows installer 程序有问题。此安装需要的dll不能运行 的一个解决方法
    jdk各版本特性
    抽象类与接口
    Integert 与 int例子详解
    Spring(mvc)思维导图
    关于存储数组有序无序
    遍历回顾(手稿)-先序中序求后序----和----中序后序求先序
  • 原文地址:https://www.cnblogs.com/anjingdian/p/15531412.html
Copyright © 2011-2022 走看看