当前位置: 首页 > wzjs >正文

网站一键生成写作教学网站

网站一键生成,写作教学网站,企业网站建设国内外差异,怎么在自己的网站加关键词🛠️WPF 自定义Halcon显示控件完整流程与 OnApplyTemplate 未触发的根本原因解析! 本片文章最后给出自定义alcon显示控件源码,可以实现图片绑定! WPF 中封装控件是非常常见的需求,而“自定义控件”是一种高级的控件复用…

🛠️WPF 自定义Halcon显示控件完整流程与 OnApplyTemplate 未触发的根本原因解析!


本片文章最后给出自定义alcon显示控件源码,可以实现图片绑定!


WPF 中封装控件是非常常见的需求,而“自定义控件”是一种高级的控件复用方式。很多人在第一次尝试自定义控件时会遇到一个常见问题:

控件已经显示到界面了,但 OnApplyTemplate() 却从未被调用!

本文将带你完整梳理 WPF 自定义控件的定义流程,并重点分析 OnApplyTemplate() 没有触发的真正原因(并不是大家常说的“忘记设置 DefaultStyleKey”!),最后解释为什么必须在 App.xaml 中引入样式资源


🧱 什么是 WPF 自定义控件?

WPF 中有三种控件封装方式:

封装方式特点
UserControl最简单,直接嵌套已有控件组合
CustomControl(继承自 Control推荐方式,支持样式模板、主题切换
TemplatedControl(高级控件)Control 基础上进一步抽象和通用性封装

本文关注的是 自定义控件(即继承自 Control 的控件),其优势包括:

  • 可复用性强
  • 样式外置,界面逻辑和结构分离
  • 支持模板定制和视觉状态管理

✍️ 自定义控件的完整定义流程

1️⃣ 创建控件类(继承 Control

public class ImageView : Control
{static ImageView(){DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageView),new FrameworkPropertyMetadata(typeof(ImageView)));}public override void OnApplyTemplate(){base.OnApplyTemplate();var part = GetTemplateChild("PART_Content") as Border;// 可访问模板内部元素}
}

OnApplyTemplate() 是你获取模板中元素的最佳时机。


2️⃣ 添加样式模板(例如 Views/ImageView.xaml

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sw="clr-namespace:MyControlLib.Views"><Style TargetType="sw:ImageView"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="sw:ImageView"><Border x:Name="PART_Content" Background="LightGray"><TextBlock Text="模板加载成功" /></Border></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>

控件模板中通过 PART_ 前缀命名可供控件类通过 GetTemplateChild 获取。


3️⃣ ✅ 最重要的一步:在 App.xaml 引入样式资源!

<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Views/ImageView.xaml" /></ResourceDictionary.MergedDictionaries></ResourceDictionary>
</Application.Resources>

OnApplyTemplate() 没有触发的原因!

唯一的原因是

样式资源没有添加到 App.xaml,导致 WPF 没有为控件应用样式!


❓为什么样式必须添加到 App.xaml?

WPF 控件模板来自于资源系统,而不是控件自己:

  • WPF 会在控件创建后,到资源系统中查找匹配该控件类型的样式
  • 如果找不到对应的样式(例如你没有在 App.xaml 添加),控件就不会被套用样式
  • 没有样式 => 没有模板 => 不调用 OnApplyTemplate()

⚠️ 也就是说:
不添加样式 = 没有模板 = OnApplyTemplate() 永远不会执行!


🧪 如何验证样式是否加载成功?

你可以在模板中放一个明显控件,比如:

<TextBlock Text="模板已应用!" Foreground="Red" />

如果程序运行后能看到这个控件,那就说明模板加载成功,OnApplyTemplate() 也会被调用。


✅ 小结

步骤是否必须
继承 Control✅ 是
设置 DefaultStyleKey✅ 是
定义样式模板✅ 是
将样式引入 App.xaml是!必须!
实现 OnApplyTemplate()可选,但用于访问模板子元素很常见

📎 最后提醒

如果你写的样式是在控件类库项目中,而不是主程序项目,那么:

🔗 引用样式路径应使用 Pack URI 方式:

<ResourceDictionary Source="/MyControlLib;component/Views/ImageView.xaml" />

⚔️ OnApplyTemplate() 与 Loaded 事件的区别

特性OnApplyTemplate()Loaded
调用时机模板刚刚被应用控件已加载进可视树
控件类型仅适用于自定义控件(Control所有控件
是否依赖模板✅ 依赖 ControlTemplate❌ 不依赖
常用于获取模板中的子元素访问可视化控件属性、执行初始化逻辑
是否能重复调用✔️ 可能多次(重设样式)❌ 通常仅一次(除非卸载重载)

Halcon自定义显示控件源码

自定义样式

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:h="clr-namespace:HalconDotNet;assembly=halcondotnet"xmlns:v="clr-namespace:ROIWindow.Views"><Style TargetType="v:ImageView"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="v:ImageView"><Grid><h:HSmartWindowControlWPFx:Name="PART_hSmart"HDoubleClickToFitContent="True"HDrawingObjectsModifier="None"HKeepAspectRatio="True"HMoveContent="False"HZoomContent="WheelForwardZoomsIn" /></Grid></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>

自定义控件代码

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;namespace ROIWindow.Views;public class ImageView : Control
{private HWindow window;private HSmartWindowControlWPF hSmart;static ImageView(){DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageView), new FrameworkPropertyMetadata(typeof(ImageView)));}public HObject Image{get { return (HObject)GetValue(ImageProperty); }set { SetValue(ImageProperty, value); }}public static readonly DependencyProperty ImageProperty =DependencyProperty.Register("Image", typeof(HObject), typeof(ImageView), new PropertyMetadata(ImageChangedCallBack));public static void ImageChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e){if (d is ImageView view)view.Display();}public void Display(){if (window == null) return;if (Image != null && Image.IsInitialized()){window.ClearWindow();window.DispObj(Image);}}public override void OnApplyTemplate(){hSmart = (HSmartWindowControlWPF)GetTemplateChild("PART_hSmart");hSmart.Loaded += Hsmart_Loaded;base.OnApplyTemplate();}private void Hsmart_Loaded(object sender, RoutedEventArgs e){window = hSmart.HalconWindow;}
}

使用方法

<v:ImageView Image="{Binding Image}" />

最后别忘记在,App.xaml, 添加样式!!!!

<ResourceDictionary Source="pack://application:,,,/CameraXXXXX;component/Controls/ImageView.xaml" />

✍️ 作者:code_bean
📅 发布于:2025年7月
🔗 原创文章,转载请注明出处!



文章转载自:

http://R0gAH0HM.gmysq.cn
http://1ibDChaf.gmysq.cn
http://mYQ6kZb4.gmysq.cn
http://USVvDKYt.gmysq.cn
http://W0RpSi8c.gmysq.cn
http://Yw92Yjpc.gmysq.cn
http://bx5TO8Xv.gmysq.cn
http://qbsmyJKx.gmysq.cn
http://A4IXMBSZ.gmysq.cn
http://8M39n21R.gmysq.cn
http://23gpqKGp.gmysq.cn
http://7cx0fBHH.gmysq.cn
http://fnlAmMfx.gmysq.cn
http://NGc0y2Z1.gmysq.cn
http://MaF7D3Zu.gmysq.cn
http://Kw0vaP9m.gmysq.cn
http://bjJOLt4U.gmysq.cn
http://5zonKAz6.gmysq.cn
http://lpzknNlb.gmysq.cn
http://CNRvCt3a.gmysq.cn
http://inNdTGWs.gmysq.cn
http://9nRb4XO2.gmysq.cn
http://0kKs6Aw6.gmysq.cn
http://lhtWTNkK.gmysq.cn
http://vdxV62T9.gmysq.cn
http://3Nz2JE9n.gmysq.cn
http://RMEeaIrt.gmysq.cn
http://bKBBHZLq.gmysq.cn
http://npCmUZGu.gmysq.cn
http://oSKHzpx2.gmysq.cn
http://www.dtcms.com/wzjs/686180.html

相关文章:

  • ui设计哪里有培训班seo快速排名软件价格
  • 电子商务网站制作步骤医院网站建设哪家好
  • 建设银行投资网站首页域联网站建设
  • 南充公司做网站网站建设项目书
  • 如何制作简单网页西安优化多钱
  • 网站开发项目延期说明网站让女友做网站模特
  • 学习网站开发流程定安免费建站公司
  • 盐城整站优化网站设计制作规范
  • 九江建网站公司有哪些怎样开发wordpress主题
  • 公司网站开发立项文档大秦wordpress付费阅读
  • 关于电子商务的网站推广方案快速一体化网站建设
  • 台州网站策划台州网站策划做公司网站麻烦吗
  • 百度公司做网站做网站 大文件
  • 南部网站建设山西建设厅网站密钥
  • 网站初期做几个比较好兴义之窗网站怎么做
  • 备案主体负责人和网站负责人石家庄企业做网站
  • 哪个推广网站好哪里卖网站模板
  • 网站建设与管理名词解释延吉建设局网站
  • 做网站是自己公司做好还是外包好html做的网站怎么弄
  • 外贸seo网站0基础网站建设教程视频
  • 网站备案查询中心大学有吗网站建设
  • 网站在百度无法验证码怎么办小白一步步做网站
  • 做家具网站江苏建工
  • 网站建设作业多少钱模块建站工具
  • 作为一个专业的网页制作人员任丘网站优化
  • 影视传媒公司网站模板旅行网站开发意义
  • 做任务挣钱的网站聚河南高端网站
  • 有名的产品设计公司seo推广软件代理
  • 做博客和做网站大学生为什么不去中建
  • net网站开发环境电脑培训机构哪里有