`

获取WPF所有控件的模板内容

 
阅读更多

 

1. 首先创建XMAL文件
<Window x:Class="ControlTemplateBrowser.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
	    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
	   Title="ControlTemplateBrowser" Height="544" Width="713" Loaded="Window_Loaded">  
   <Grid Margin="10" Name="grid">  
	      <Grid.ColumnDefinitions>  
	      <ColumnDefinition Width="*">ColumnDefinition>  
	       <ColumnDefinition Width="3*">ColumnDefinition>  
	      Grid.ColumnDefinitions>  
	      <ListBox DisplayMemberPath="Name" Name="lstTypes" SelectionChanged="lstTypes_SelectionChanged">ListBox>  
      <TextBox Grid.Column="1" Name="txtTemplate" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" FontFamily="Consolas">TextBox>        
	     <Grid>  
	<Window>  

 
2. 编写程序代码
	 using System;  
	 using System.Collections.Generic;  
	 using System.Text;  
	 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.Shapes;  
	 using System.Reflection;  
	 using System.Xml;  
	 using System.Windows.Markup;  
	   
	   
	 namespace ControlTemplateBrowser  
	 {  
	     ///   
	     /// Interaction logic for Window1.xaml   
	     ///    
	   
	     public partial class Window1 : System.Windows.Window  
	     {  
	   
	         public Window1()  
	         {  
	             InitializeComponent();  
	         }  
	   
	         private void Window_Loaded(object sender, EventArgs e)  
	         {                      
	             Type controlType = typeof(Control);  
	             List derivedTypes = new List();  
	   
	             // Search all the types in the assembly where the Control class is defined.   
	             Assembly assembly = Assembly.GetAssembly(typeof(Control));  
	             foreach (Type type in assembly.GetTypes())  
	             {  
	                 // Only add a type of the list if it's a Control, a concrete class, and public.   
	                 if (type.IsSubclassOf(controlType) && !type.IsAbstract && type.IsPublic)  
	                 {  
	                     derivedTypes.Add(type);  
	                 }  
	             }  
	               
	             // Sort the types by type name.   
	             derivedTypes.Sort(new TypeComparer());  
	   
	             // Show the list of types.   
	             lstTypes.ItemsSource = derivedTypes;  
	         }  
	   
	         private void lstTypes_SelectionChanged(object sender, SelectionChangedEventArgs e)  
	         {              
	             try  
	             {  
	                 // Get the selected type.   
	                 Type type = (Type)lstTypes.SelectedItem;                                              
	   
	                 // Instantiate the type.   
	                 ConstructorInfo info = type.GetConstructor(System.Type.EmptyTypes);  
	                 Control control = (Control)info.Invoke(null);  
	                                   
	                 Window win = control as Window;  
	                 if (win != null)  
	                 {                      
	                     // Create the window (but keep it minimized).   
	                     win.WindowState = System.Windows.WindowState.Minimized;  
	                     win.ShowInTaskbar = false;  
	                     win.Show();  
	                 }  
	                 else  
	                 {  
	                     // Add it to the grid (but keep it hidden).   
	                     control.Visibility = Visibility.Collapsed;  
	                     grid.Children.Add(control);  
	                 }  
	   
	                 // Get the template.   
	                 ControlTemplate template = control.Template;  
	  
	                 // Get the XAML for the template.   
	               XmlWriterSettings settings = new XmlWriterSettings();  
	                 settings.Indent = true;  
	                 StringBuilder sb = new StringBuilder();  
	               XmlWriter writer = XmlWriter.Create(sb, settings);  
	               XamlWriter.Save(template, writer);  
	
	                // Display the template.   
	               txtTemplate.Text = sb.ToString();  
	                 
	                 // Remove the control from the grid.   
	                 if (win != null)  
	               {  
	                     win.Close();  
	                }  
	              else  
	            {  
	                   grid.Children.Remove(control);  
	                 }  
	            }  
	          catch (Exception err)  
	          {  
	               txtTemplate.Text = "<< Error generating template: " + err.Message + ">>";  
	           }  
	       }  
	   }  
	  
	    public class TypeComparer : IComparer  
	     {  
	        public int Compare(Type x, Type y)  
	        {  
	           return x.Name.CompareTo(y.Name);  
	        }  
	    }  
	}  

 

 

分享到:
评论

相关推荐

    WPF Prism MVVM【动态添加控件并可用鼠标、拖动、缩放、旋转】

    主要采用了Prism.DryIoc的MVVM方式,用到控件和方法:ItemsControl(控件模板)、Thumb(可拖动控件)、Adorner(装饰器)、CommandParameter的多参数传递、GetChildObjectByUid(通过UID查找某类型的子控件)

    DataGrid 控件的样式和模板

    关于DataGrid 控件的样式和模板,内容很实用

    WPF编程宝典 part1

    18.4.5 使用不同的控件模板 483 18.5 创建自定义面板 485 18.5.1 两步布局过程 485 18.5.2 Canvas面板的副本 488 18.5.3 更好的WrapPanel面板 489 18.6 自定义绘图元素 492 18.6.1 OnRender( )方法 493 18.6.2 评估...

    C# WPF 父控件通过使用可视化树找到子控件的示例代码

    在我们使用WPF设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里。但是一旦将控件放到数据模板中,在后台就没有办法通过控件的名字来获取它了,更没办法对它进行操作(例如,隐藏,改变控件的某个值)...

    WPF编程宝典—C#2010版(源码)

    第17章 控件模板 第18章 自定义元素 第19章 数据绑定 第20章 格式化绑定的数据 第21章 数据视图 第22章 列表、网格和树 第23章 窗口 第24章 页面和导航 第25章 菜单、工具栏和功能区 第26章 声音和视频 第...

    WPF编程宝典 part2

    18.4.5 使用不同的控件模板 483 18.5 创建自定义面板 485 18.5.1 两步布局过程 485 18.5.2 Canvas面板的副本 488 18.5.3 更好的WrapPanel面板 489 18.6 自定义绘图元素 492 18.6.1 OnRender( )方法 493 18.6.2 评估...

    Fluent.Ribbon:像在Office中一样的WPF功能区控件

    流利的丝带 Fluent.Ribbon是一个库,为Windows Presentation Foundation(WPF)实现类似于Office的用户界面。 它提供诸如RibbonTabControl,Backstage,Gallery,QuickAccessToolbar,ScreenTip等控件。文献资料请...

    一款非常好的WPF编程宝典2010 源代码

    15.3 创建控件模板 375 15.3.1 简单按钮模板 375 15.3.2 模板绑定 376 15.3.3 模板触发器 378 15.4 组织模板资源 380 15.4.1 分解按钮控件的模板 381 15.4.2 通过样式应用模板 383 15.4.3 自动应用模板 384 ...

    wpf源码大全 精通C#3.0图书源码 详细源码 学习好用

    示例描述:本章学习WPF资源、样式和控件模板。 AssemblyResourceDemo1 使用程序集资源。 BaseOnStyle 样式的继承使用示例。 DataTriggerDemo 数据触发器使用示例。 EventSetterDemo 绑定事件处理器示例。...

    C#调用HALCON 20,HSmartWindowControl控件高级应用,模板匹配项目

    基于HALCON 20.0和VS2019,C#中直接使用HSmartWindowControl高级控件,可以直接对图片进行鼠标拖动及滚轮缩放功能,...解决了HSmartWindowControl控件无法正常使用绘图功能的缺陷,采用巧妙方式进行ROI绘制和模板生成。

    Apress.Pro.WPF.in.C.Sharp.2008.2nd.Edition.Feb.2008

    15.3 创建控件模板 375 15.3.1 简单按钮模板 375 15.3.2 模板绑定 376 15.3.3 模板触发器 378 15.4 组织模板资源 380 15.4.1 分解按钮控件的模板 381 15.4.2 通过样式应用模板 383 15.4.3 自动应用模板 384 15.4.4 ...

    DataGrid 动态添加模板列 实现代码

    另外, 还会告诉你怎么获取和更新用户对EditItemTemplate所做的改变. 例子将会是很简单的. 然后, 我很快就会在TripleASP上面正式发布一个改进后的TableEditor版本. 这个版本将更好的说明如何使用动态模版. ITempalte...

    Release:发布所有项目的文件夹

    外观预定义的控件模板。 在创建任何控件之前,您将需要调用vl::presentation::theme::RegisterTheme来设置默认外观。 有关详细信息,请阅读 。 工具 GacGen32.exe / GacGen64.exe用于x86和x64的GacUI资源编译器和C ...

    CrystalDecisions:Crystal报告.NET Framework的NuGets程序包

    安装人员 版本号特色水晶报表发动机模板引擎报告来源共享网页Windows窗体WPF.ViewerShared WPF查看器ReportAppServer 企业查看报告源CliendDoc 沟通交流通用控件通用对象模型控制器多维数据集模型数据模型数据集转换...

Global site tag (gtag.js) - Google Analytics