WPF整理-自定义一个扩展标记(custom markup extension)
"Markup extensions are used to extend the capabilities of XAML, by providing declarative
operations that need more than just setting some properties. These can be used to do pretty
much anything, so caution is advised – these extensions must preserve the declarative nature
of XAML, so that non-declarative operations are avoided; these should be handled by normal
C# code."
假如我们需要实现下面的扩展标记,这个标记扩展用来提供个随机数。
<TextBlock FontSize="{ mext:Random 10,100}" Text="DebugLZQ" x:Name="text1"/>
我们可以这样实现这个标记扩展。
1.添加一个名为CustomMarkupExtension的类库,添加一个RandomExtension.cs类,让它继承自MarkupExtension。因为MarkupExtension类在System.Xaml程序集中,因此需要添加该程序集引用。
为实现标记扩展,我们还需要实现MarkupExtension类的ProvideValue方法。
RandomExtension.cs如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Markup; namespace CustomMarkupExtension
{
public class RandomExtension:MarkupExtension
{
readonly int _from, _to; public RandomExtension(int from,int to)
{
_from = from;
_to = to;
} public RandomExtension(int to):this(,to)
{
} static readonly Random _rdn = new Random(); public override object ProvideValue(IServiceProvider serviceProvider)
{
return (double)_rdn.Next(_from, _to);
}
}
}
OK,完成。
2.使用这个标记扩展。我们新建一个名为TestRandom的WPF程序,添加CustomMarkupExtension类库的引用。
在需要使用的页面中,添加一个映射:
<Window x:Class="TestRandom.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mext="clr-namespace:CustomMarkupExtension;assembly=CustomMarkupExtension"
注意这个映射和前面的一些映射的不同之处是:因为clr-namespace不在TestRandom程序集中,因此必须注明所在程序集名称!
这样我们就可以使用如下:
<StackPanel>
<TextBlock FontSize="{ mext:Random 10,100}" Text="DebugLZQ" x:Name="text1"/>
<TextBlock Text="{Binding FontSize, ElementName=text1}"/>
</StackPanel>
使用方法看懂类没有?没有?关注那个构造函数。也可参考DebugLZQ的博文:WPF整理-XAML构建后台类对象
设计器中效果如下:
运行之,效果如下:
WPF整理-自定义一个扩展标记(custom markup extension)的更多相关文章
- [WPF 自定义控件]自定义一个“传统”的 Validation.ErrorTemplate
1. 什么是Validaion.ErrorTemplate 数据绑定模型允许您将与您Binding的对象相关联ValidationRules. 如果用户输入的值无效,你可能希望在应用程序 用户界面 ( ...
- WPF 如何自定义一个弹框
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 简述: 手工以原生Grid的方式,自定义了一个仿弹窗效果,优点可以自定义,缺点需要自己实现以及维护整个弹窗的效 ...
- SQL Server Reporting Services 自定义数据处理扩展DPE(Data Processing Extension)
最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...
- SQL Server Reporting Service(SSRS) 第五篇 自定义数据处理扩展DPE(Data Processing Extension)
最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...
- WPF扩展标记
标记扩展和 WPF XAML,标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能 XAML 处理器和标记扩展 XAML 分析器可将特性值解释为可转换成基元的文本字符串,或可通过 ...
- XML简介——可扩展标记语言(Extensible Markup Language)
(What) XML是什么? XML指可扩展标记语言(Extensible Markup Language) 1. XML是一种标记语言,类似HTML. 2. XML具有自我描述性 3. XML ...
- WPF 3D模型的一个扩展方法
原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...
- WPF扩展标记X:STATIC
原文:WPF扩展标记X:STATIC public class XStaic { public static string Content = "确定"; ...
- WPF整理-Style
"Consistency in a user interface is an important trait; there are many facets of consistency, ...
随机推荐
- JavaScript闭包之“词法作用域”
大家应该写过下面类似的代码吧,其实这里我想要表达的是有时候一个方法定义的地方和使用的地方会相隔十万八千里,那方法执行时,它能访问哪些变量,不能访问哪些变量,这个怎么判断呢?这个就是我们这次需要分析的问 ...
- Linux下安装和配置JDK与Tomcat(升级版)
在这个版本 Linux下安装和配置JDK与Tomcat(入门版) 的基础上优化升级 1.下载相关软件 apache-tomcat-6.0.37.tar.gz jdk-6u25-linux-i586-r ...
- Redis学习 - 配置属性:protected-mode
根据redis的说明,protected-mode在同时存在如下两种情况时触发: 1) The server is not binding explicitly to a set of address ...
- js parseInt 显示0
parseInt 有第二个参数, 就是进制参数 parseInt("08", 10); //表示这个数字是十进制的就不会出错了.
- dex文件格式一
一.生成dex文件 我们可以通过java文件来生成一个简单的dex文件 编译过程: 首先编写java代码如下: (1) 编译成 java class 文件 执行命令 : javac Hello.jav ...
- Hbuilder MUI 选择器(Picker)设置默认选项
mui 联动选择初始化很多人都遇到问题,就是setselectedvalue 不好用,实际上这个地方应该是有bug的 所以只能用setselectedindex 来实现 下面我是我的实现方式供大家参考 ...
- Java批量文件打包下载
经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...
- AngularJS 分页
前端源码: <div> <h1>列表页33</h1> <table> <thead> <tr><td>CandiID ...
- VB中复制-粘贴-剪切键实现
If Me.ActiveControl.GetType.BaseType.ToString = "System.Windows.Forms.TextBoxBase" Then Wi ...
- JavaScript高级程序设计学习笔记--表单脚本
提交表单 用户单击提交按钮或图像按钮时,就会提交表单.使用<input>和<button>都可以定义提交按钮,只要将其type特性的值设置为"submit" ...