Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >让你编写的控件库在 XAML 中有一个统一的漂亮的命名空间(xmlns)和命名空间前缀

让你编写的控件库在 XAML 中有一个统一的漂亮的命名空间(xmlns)和命名空间前缀

作者头像
walterlv
发布于 2018-09-18 04:57:23
发布于 2018-09-18 04:57:23
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

让你编写的控件库在 XAML 中有一个统一的漂亮的命名空间(xmlns)和命名空间前缀

发布于 2018-05-22 13:21 更新于 2018-09-01 00:04

在 WPF XAML 中使用自己定义的控件时,想必大家都能在 XAML 中编写出这个控件的命名空间了。然而——我写不出来,除非借助 ReSharper。

如果控件能够有一个漂亮的命名空间和命名空间前缀呢?——好吧,还是写不出来,不过,至少漂亮些。本文将指导你自定义在 XAML 中使用的命名空间。


达到什么样的效果?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<UserControl
    x:Class="HuyaHearhira.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:w="http://walterlv.github.io/demo"
    <Grid>
        <w:DemoPage />
    </Grid>
</UserControl>

注意到 DemoPage 所在的命名空间了吗?是 http://walterlv.github.io/demo 哦。而且,命名空间前缀是 w。这是不是比下面这种看得清爽多了呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<UserControl
    x:Class="HuyaHearhira.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:newCsprojDemo="clr-namespace:Walterlv.NewCsprojDemo;assembly=Walterlv.NewCsprojDemo">
    <Grid>
        <newCsprojDemo:DemoPage />
    </Grid>
</UserControl>

当然,好处不止是更清爽,还有更多,总结起来是这三个:

  1. 利于 API 的升级 例如你写了一个库提供了一些可以在 XAML 中使用的控件,但是后来随着功能的强大你把程序集拆分成了多个。这时,如果没有这样的命名空间定义,那就意味着使用你的库的大量开发者需要手工修改 XAML 中的命名空间前缀定义。而使用了这样的命名空间定义的方法后,开发者只需要重新编译一遍即可。
  2. 简化命名空间前缀 如果你的库有多个命名空间下都提供控件,那么可以使用命名空间定义将这些 C#/.NET 命名空间都映射到同一个 url 下,使得 XAML 中的命名空间声明可以更少。
  3. 更加清晰的命名空间声明 可以通过将命名空间前缀定义得更加清晰,更有效地利用每一个字符,而不是一些结构化的 clr-namespaceassembly

这是怎么做到的呢?

System.Windows.Markup 命名空间下,有两个程序集级别的 Attribute,分别是 XmlnsDefinitionXmlnsPrefixXmlnsDefinition 定义某个 C# 命名空间和一段命名空间字符串是等意的,XmlnsPrefix 定义此命名空间的默认前缀(只是默认而已)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Windows.Markup;

[assembly: XmlnsDefinition("http://walterlv.github.io/demo", "Walterlv.NewCsprojDemo")]
[assembly: XmlnsPrefix("http://walterlv.github.io/demo", "w")]

于是,利用这两个 Attribute 能够达到本文一开始的奇妙的效果。

如果你用工具(例如 ReSharper)自动生成命名空间前缀时,才会使用这样默认的命名空间前缀,否则,你随便填。

还有什么更高级的玩法吗?

也许你注意到 WPF 有一些一开始就帮你生成好的命名空间前缀,例如这些:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<UserControl
    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">
</UserControl>

如果我们也把命名空间定义到这里会如何呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Walterlv.NewCsprojDemo")]

哇,我们竟然可以不用带前缀啦!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<UserControl
    x:Class="HuyaHearhira.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <DemoPage />
    </Grid>
</UserControl>

这在项目内为一些几乎侵染全部代码的标记扩展是很棒的一波语法糖。例如——自己实现的本地化标记扩展。

一些限制

值得注意的是,XAML 命名空间的定义只会在外部程序集生效。这是说,如果你在 A 程序集中定义了命名空间,那么只有引用了 A 程序集的 B 或者 C 才可以使用到新定义的命名空间;A 程序集自身是没有办法使用此命名空间的。


参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/define-xmlns-of-for-xaml.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WPF自学入门(一)WPF-XAML基本知识
1、XAML是派生自XML的可扩展应用程序标记语言(Extensible Application Markup Language)由微软创造应用在WPF,Silverlight等开发技术中。
黄昏前黎明后
2019/09/11
2.7K0
WPF自学入门(一)WPF-XAML基本知识
WPF 多线程 UI:设计一个异步加载 UI 的容器
2018-09-08 12:53
walterlv
2018/09/18
4.1K0
WPF 多线程 UI:设计一个异步加载 UI 的容器
【愚公系列】2022年10月 WPF控件专题XAML介绍
XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面,而这种实现方式和ASP.NET中的"代码后置"模型非常类似。XAML是一种解析性的语言,尽管它也可以被编译。它的优点是简化编程式上的用户创建过程,应用时要添加代码和配置等。
愚公搬代码
2022/12/01
3690
[WPF]本地化入门
WPF的本地化是个很常见的功能,我做过的WPF程序大部分都实现了本地化(不管最终有没有用到)。通常本地化有以下几点需求:
dino.c
2019/01/18
2.6K0
[WPF]本地化入门
【愚公系列】2023年09月 WPF控件专题 XAML介绍
WPF(Windows Presentation Foundation)是微软推出的一种基于.net框架的图形用户界面技术,它使用XAML(eXtensible Application Markup Language)作为UI的描述语言。XAML是一种基于XML的标记语言,用于描述WPF应用程序的用户界面、控件、布局、样式和数据绑定。XAML可以将UI元素和代码分离,使得设计人员和开发人员能够分别负责UI和逻辑的开发,从而提高开发效率。
愚公搬代码
2023/09/16
4470
学习使用Wpf开源的文本编辑器—smithhtmleditor
前言 本文主要介绍使用Wpf文本编辑器——smithhtmleditor。 编辑器使用 首先新建一个项目WpfEditor。 然后到Codeplex下载smithhtmleditor。 下载地址:ht
Kiba518
2021/10/15
2K0
.NET CORE(C#) WPF亚克力窗体
使用 .Net Core 3.1 创建名为 “AcrylicWindow” 的WPF模板项目,添加三个Nuget库:MaterialDesignThemes、MaterialDesignColors和FluentWPF,其中亚克力效果是由FluentWPF控件库实现的。
沙漠尽头的狼
2020/01/16
2.3K0
.NET6三分钟搭建WPF三维应用
要运行本文中的示例,请先安装Vistual Studio 2022,社区版就可以了。
郑子铭
2023/12/19
2830
.NET6三分钟搭建WPF三维应用
WPF入门到放弃(二) | 初识XAML
WPF也是我今年刚开始深入去了解,看了不少的学习视频和书籍,受剑神Python入门到放弃的启发,想把这段时间学习内容做个总结,一是因为我相信技术总是需要不断的总结与练习才能有所进步,二是希望帮助初学者对WPF有个初步的了解,大家一起探讨学习进步。
剑指工控
2021/11/09
1.8K0
UWP基础教程 - XAML开篇
XAML是英文Extensible Application Markup Language的缩写,中文可以称为“可扩展应用程序标记语言”,是基于Extensive Markup Language(XML)可扩展标记语言,在Windows 10 UWP、Windows 8、Windows Phone、Silverlight以及WPF技术框架下都可以使用XAML的语法作为应用UI界面的开发。 XAML简化了创建UI的过程,使UI编程更加简单明了,在使用XMAL的项目中,以".xaml"作为文件扩展名。每个XAM
陈仁松
2018/03/20
1.9K0
UWP基础教程 - XAML开篇
Silverlight:页面/控件继承的二种写法
前言:此乃水文,高手绕道. 只要是稍微象样点的项目,一般都会先弄一个PageBase或UserControlBase做基类,然后其它页面/用户控件继承自它,标准的写法如下: 先定义基类: PageBase.cs using System.Windows.Controls; namespace sl_test { public class PageBase:UserControl { } } 然后创建一个用户控件Page1继承自它: 后端cs部分: namespace sl_tes
菩提树下的杨过
2018/01/23
5650
Prism region in tabcontrol
有小伙伴向我提问,在使用Prism开发WPF的时候会遇到TabControl作为Region容器的场景。那么会遇到如下问题:
JusterZhu
2025/01/23
1130
Prism region in tabcontrol
[翻译]开发Silverlight 2.0的自定义控件
原文:Developing a Custom Control for Silverlight 2.0 译者:张善友 Download MediaButton_demo - 131.06 KB
张善友
2018/01/30
7500
[翻译]开发Silverlight 2.0的自定义控件
Silverlight Telerik控件学习:带CheckBox复选框的树形TreeView控件
在web开发中,带checkbox的tree是一个很有用的东东,比如权限选择、分类管理,如果不用sl,单纯用js+css实现是很复杂的,有了SL之后,就变得很轻松了 解决方案一: 利用Silvelright ToolKit(微软的开源项目),项目地址http://silverlight.codeplex.com/ 在线演示地址:http://silverlight.net/content/samples/sl4/toolkitcontrolsamples/run/default.html 解决方案二
菩提树下的杨过
2018/01/23
2.1K0
Silverlight Telerik控件学习:带CheckBox复选框的树形TreeView控件
《深入浅出WPF》——模板学习
图形用户界面(GUI,Graphic User Interface)应用较之控制台界面(CUI,Command User Interface)应用程序最大的好处就是界面友好、数据显示直观。CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本、列表、图形等多种形式立体显示。 用户体验在GUI程序设计中起着举足轻重的作用——用户界面设计成什么样子看上去才够漂亮?控件如何安排才简单易用并且少犯错误?(控件并不是越复杂越好)这些都是设计师需要考虑的问题。WPF系统不但支持传统Windows Forms(简称WinForm)编程的用户界面和用户体验设计,更支持使用专门的设计工具Microsoft Expression Blend进行专业设计,同时还推出了以模板为核心的新一代设计理念(这是2010年左右的书,在那时是新理念,放现在较传统.NET开发也还行,不属于落后的技术)。 本章我们就一同来领略WPF强大的模板功能的风采。
全栈程序员站长
2022/09/09
5.1K0
《深入浅出WPF》——模板学习
Windows 10 应用创建模糊背景窗口的三种方法
发布于 2018-07-16 11:44 更新于 2018-08-31 23:59
walterlv
2018/09/18
3K0
Windows 10 应用创建模糊背景窗口的三种方法
X--名称空间详解
X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML代码将XAML代码编译为CLR代码。
莫问今朝
2018/08/31
1.5K0
X--名称空间详解
.NET8:快速集成Rapid.NET三维控件
.NET8正式版本发布了,AnyCAD Rapid.NET针对.NET8进行了升级和优化。本文以WPF项目为例介绍在.NET8中使用AnyCAD Rapid.NET三维控件。
郑子铭
2024/01/06
1820
.NET8:快速集成Rapid.NET三维控件
3 Ways to create a window with blurring background on Windows 10
发布于 2018-07-16 11:14 更新于 2018-09-01 00:00
walterlv
2018/09/18
1K0
3 Ways to create a window with blurring background on Windows 10
WPF使用自定义控件UserControl
大佬们基本上都在讲怎么自定义控件,却怎么也没有说明怎么使用这些个自定义的控件,然后看完教程的本小白只能干瞪眼..可能大佬们不屑这样基础的东西 首先新建一个用户控件UserControl1.xaml,这个会用几下VS的应该都没有难度。
zls365
2021/10/19
1.9K0
相关推荐
WPF自学入门(一)WPF-XAML基本知识
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验