广告
返回顶部
首页 > 资讯 > 精选 >WPF自定义控件如何实现
  • 772
分享到

WPF自定义控件如何实现

2023-07-05 08:07:25 772人浏览 薄情痞子
摘要

今天小编给大家分享一下WPF自定义控件如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方式一:基于现有控件进行扩展,如

今天小编给大家分享一下WPF自定义控件如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

方式一:基于现有控件进行扩展,如基于button进行扩展,UI可直接用xmal进行编辑设计,逻辑用xaml.cs进行编辑

WPF自定义控件如何实现

方法二:直接创建wpf自定义控件

WPF自定义控件如何实现

本文用方法二开展自定义控件!!!

自定义控件的内容在代码cs文件中,自定义控件继承自Control,ui界面可在Genric.xaml中定义。

在Generic.xaml中定义控件界面

  <Style  TargetType="{x:Type ctrl:DevButton}">        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type ctrl:DevButton}">                    <Border Background="{TemplateBinding Background}"                            BorderBrush="{TemplateBinding BorderBrush}"                            BorderThickness="{TemplateBinding BorderThickness}">                                                   <Grid>                                <Grid.ColumnDefinitions>                                    <ColumnDefinition Width="0.1*" MaxWidth="5"/>                                    <ColumnDefinition/>                                </Grid.ColumnDefinitions>                                //自定义控件中的组成 ,需要定义x:name,后台代码需要用到,button中的DevName是后台cs中定义的依赖属性                                <Rectangle Margin="1" x:Name="statusLed"/>                                <Button Grid.Column="1" x:Name="devBtn" Content="{TemplateBinding DevName}"/>                            </Grid>                                            </Border>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style>

 上述界面中定义了两个控件,组成本自定义控件的外观显示。一个rectangle,用颜色对状态进行显示,一个button,是本自定义控件的主要内容,需要显示设备名称,Click事件/Command需要触发任务。

后台处理

1  定义自定义属性DevName

        public string DevName        {            get { return (string)GetValue(DevNameProperty); }            set { SetValue(DevNameProperty, value); }        }        public static readonly DependencyProperty DevNameProperty =        DependencyProperty.ReGISter("DevName", typeof(string), typeof(DevButton), new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnDevNameChanged)));        private static void OnDevNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)        {            DevButton ctrl =sender as DevButton;            ctrl.DevName = e.NewValue.ToString();                   }

2  定义与前端界面UI元素对应的信息

        private Rectangle statusLed;        private Button devBtn;        public override void OnApplyTemplate()        {            //备用方法 Template.FindName(DownButtonKey, this) as Button;            statusLed = GetTemplateChild("statusLed") as Rectangle;            devBtn = GetTemplateChild("devBtn") as Button;            devBtn.Click += DevBtn_Click;            base.OnApplyTemplate();                          }

依据控件名称查找模板中的控件,并注册button的click事件

3  定义事件

       private void DevBtn_Click(object sender, RoutedEventArgs e)        {            MessageBox.Show(DevName);        }

自定义控件主要就是上述几步。总体代码如下:

using System;using System.Collections.Generic;using System.Globalization;using System.Linq;using System.Text;using System.Threading.Tasks;using System.windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes; namespace WpfApp2{    /// <summary>    /// Author:yut 2022-12-21    /// Function:自定义控件,用于设备的启停控制,同时显示设备的运行状态    /// <summary>    public class DevButton : Control    {                     public DevButton()        {            SetCurrentValue(WidthProperty, 100d);            SetCurrentValue(HeightProperty, 25d);            SetCurrentValue(BackgroundProperty, Brushes.Yellow);                    }        static DevButton()        {            DefaultStyleKeyProperty.OverrideMetadata(typeof(DevButton), new FrameworkPropertyMetadata(typeof(DevButton)));        }         private Rectangle statusLed;        private Button devBtn;        public override void OnApplyTemplate()        {                        statusLed = GetTemplateChild("statusLed") as Rectangle;            devBtn = GetTemplateChild("devBtn") as Button;            devBtn.Click += DevBtn_Click;            base.OnApplyTemplate();                          }         #region 自定义属性        public int DevId        {            get { return (int)GetValue(DevIdProperty); }            set { SetValue(DevIdProperty, value); }        }        public static readonly DependencyProperty DevIdProperty =          DependencyProperty.Register("DevId", typeof(int), typeof(DevButton), new FrameworkPropertyMetadata(-1,new PropertyChangedCallback(OnDevIdChanged)));        private static void OnDevIdChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)        {            DevButton ctrl = (DevButton)sender;            ctrl.DevId = (int)e.NewValue;        }         public string DevName        {            get { return (string)GetValue(DevNameProperty); }            set { SetValue(DevNameProperty, value); }        }        public static readonly DependencyProperty DevNameProperty =        DependencyProperty.Register("DevName", typeof(string), typeof(DevButton), new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnDevNameChanged)));        private static void OnDevNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)        {            DevButton ctrl =sender as DevButton;            ctrl.DevName = e.NewValue.ToString();                   }         public int DevStatus        {            get { return (int)GetValue(DevStatusProperty); }            set            {                SetValue(DevStatusProperty, value);                          }        }        public static readonly DependencyProperty DevStatusProperty =          DependencyProperty.Register("DevStatus", typeof(int), typeof(DevButton), new FrameworkPropertyMetadata(-1,new PropertyChangedCallback(OnDevStatusChanged)));        private static void OnDevStatusChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)        {            DevButton ctrl = (DevButton)sender;            ctrl.DevStatus = (int)e.NewValue;             ctrl.StatusBrush=(ctrl.DevStatus>0)?Brushes.Green:Brushes.LightGray;        }         public Brush StatusBrush        {            get { return (Brush)GetValue(StatusBrushProperty); }            set            {                SetValue(StatusBrushProperty, value);            }        }        public static readonly DependencyProperty StatusBrushProperty =        DependencyProperty.Register("StatusBrush", typeof(Brush), typeof(DevButton), new FrameworkPropertyMetadata(Brushes.LightGray));         #endregion          private void DevBtn_Click(object sender, RoutedEventArgs e)        {            MessageBox.Show(DevName);                           }     }}
<ResourceDictionary    xmlns="Http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:ctrl="clr-namespace:WpfApp2">       <Style  TargetType="{x:Type ctrl:DevButton}">        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type ctrl:DevButton}">                    <Border Background="{TemplateBinding Background}"                            BorderBrush="{TemplateBinding BorderBrush}"                            BorderThickness="{TemplateBinding BorderThickness}">                                                   <Grid>                                <Grid.ColumnDefinitions>                                    <ColumnDefinition Width="0.1*" MaxWidth="5"/>                                    <ColumnDefinition/>                                </Grid.ColumnDefinitions>                            <!--Fill="{TemplateBinding DevStatus, Converter={StaticResource IntToBrushes}}"-->                            <Rectangle Margin="1" x:Name="statusLed" Fill="{TemplateBinding StatusBrush}"/>                                <Button Grid.Column="1" x:Name="devBtn" Content="{TemplateBinding DevName}"/>                            </Grid>                                            </Border>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style></ResourceDictionary>
<Window x:Class="WpfApp2.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlfORMats.org/markup-compatibility/2006"        xmlns:local="clr-namespace:WpfApp2"        mc:Ignorable="d"        Title="MainWindow" Height="450" Width="800">    <Grid>        <StackPanel>            <TextBlock Text="******************"/>            <local:DevButton DevName="电机" DevStatus="2"/>            <TextBlock Text="******************"/>        </StackPanel>    </Grid></Window>

运行效果如下:

WPF自定义控件如何实现

以上就是“WPF自定义控件如何实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: WPF自定义控件如何实现

本文链接: https://www.lsjlt.com/news/350603.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • WPF自定义控件如何实现
    今天小编给大家分享一下WPF自定义控件如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方式一:基于现有控件进行扩展,如...
    99+
    2023-07-05
  • WPF自定义控件的实现
    方式一:基于现有控件进行扩展,如基于button进行扩展,UI可直接用xmal进行编辑设计,逻辑用xaml.cs进行编辑 方法二:直接创建wpf自定义控件 本文用方法二开展自定义...
    99+
    2023-03-03
    WPF自定义控件
  • wpf如何自定义控件属性
    在WPF中,可以通过创建自定义控件继承自现有的控件,并添加自定义属性来实现自定义控件属性。 以下是一个简单的示例,展示了如何创建一个...
    99+
    2023-10-24
    wpf
  • C# WPF实现的语音播放自定义控件
    目录主界面xaml控件设计XAML控件CS代码原理很简单,利用Path画一个图,然后用动画进行播放,播放时间由依赖属性输入赋值与控件内部维护的一个计时器进行控制。 控件基本是玩具,无...
    99+
    2022-11-12
  • WPF自定义Expander控件样式实现酷炫Style
    首先, 看一下效果图。 点我看视频教程 实现思路 1.PS处理两张选中得特效背景, 一张为主选择得效果图, 另外一张为次选择项得效果图。 ![](//img.jbzj.com/fi...
    99+
    2022-11-13
  • WPF中用户控件和自定义控件如何使用
    本篇内容主要讲解“WPF中用户控件和自定义控件如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“WPF中用户控件和自定义控件如何使用”吧!介绍无论是在WPF中还是WinForm中,都有用户控...
    99+
    2023-07-05
  • 详解WPF中用户控件和自定义控件的使用
    目录介绍用户控件自定义控件按钮案例自定义控件中常用的知识点介绍 无论是在WPF中还是WinForm中,都有用户控件(UserControl)和自定义控件(CustomControl)...
    99+
    2023-03-02
    WPF用户控件 自定义控件 WPF用户控件 WPF 自定义控件 WPF 控件
  • 自定义WPF分页控件的全过程记录
    一、分页控件功能说明# 实现如上图所示的分页控件,需要实现一下几个功能: 可以设置每页能够展示的最大列数(例如每页8列、每页16列等等)。 加载的数组总数量超过...
    99+
    2022-11-12
  • .NET自定义控件应该如何实现
    本篇内容介绍了“.NET自定义控件应该如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!.NET自定义控件有很多人其实不太适应去试用,一...
    99+
    2023-06-17
  • Android如何自定义实现日历控件
    这篇文章主要介绍Android如何自定义实现日历控件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1. Calendar类2. 布局创建calendar_layout.xml<LinearLayou...
    99+
    2023-06-25
  • wpf自定义控件绑定结构体的方法是什么
    要在WPF中绑定结构体,可以使用以下方法:1. 创建一个继承自`DependencyObject`的自定义控件类,该类包含一个依赖属...
    99+
    2023-09-06
    wpf
  • WPF利用WindowChrome实现自定义窗口
    目录简介效果图自定义最小化、最大化、关闭按钮布局实现结语简介 Microsoft官网关于 WindowChome 的介绍 截取Microsoft文章的一段话: 若要在保留其标准功能时...
    99+
    2023-02-16
    WPF WindowChrome自定义窗口 WPF 自定义窗口 WPF WindowChrome
  • Android自定义实现日历控件
    本文实例为大家分享了Android自定义实现日历控件的具体代码,供大家参考,具体内容如下 1. Calendar类 2. 布局 创建calendar_layout.xml <...
    99+
    2022-11-12
  • WPF自定义路由事件的实例教程
    目录路由事件模型【分析代码】【自定义路由事件】总结路由事件模型 传统的简单事件模型中,在消息激发是将消息通过事件订阅的然后交给事件的相应者,事件的相应者使用事件的处理器来做出相应,这...
    99+
    2022-11-12
  • Android 实现自定义折线图控件
    目录前言概述原点计算Y轴宽度计算X轴高度X轴绘制轴线X轴刻度间隔网格线、文本Y轴计算Y轴分布刻度间隔、网格线、文本折线代码前言 日前,有一个“折现图”的需求,...
    99+
    2022-11-13
  • Android自定义控件实现时间轴
    本文实例为大家分享了Android自定义控件实现时间轴的具体代码,供大家参考,具体内容如下 由于项目中有需求,就简单的封装一个,先记录一下,有时间上传到github。 1、先增加自定...
    99+
    2022-11-12
  • Qt自定义控件实现仪表盘
    目录1.预览图2. 代码头文件源文件3. 用法1.预览图 2. 代码 头文件 #ifndef MOTORMETER_H #define MOTORMETER_H #include...
    99+
    2022-11-13
  • Android继承现有控件拓展实现自定义控件textView
    通常情况下,Android实现自定义控件无非三种方式。   Ⅰ、继承现有控件,对其控件的功能进行拓展。   Ⅱ、将现有控件进行组合,实现功能更加强大控件。   Ⅲ、重写View...
    99+
    2022-06-06
    自定义 Android
  • Android如何实现一个倒计时自定义控件
    这篇“Android如何实现一个倒计时自定义控件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android如何实现一个倒计...
    99+
    2023-06-29
  • Angular如何使用ControlValueAccessor实现自定义表单控件
    这篇文章主要介绍了Angular如何使用ControlValueAccessor实现自定义表单控件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本篇文章给大家介绍一下Angu...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作