这篇介绍在wpf设计时集合项属性添加项的定义和自定义控件右键菜单的方法
集合项属性设计时支持
1.为集合属性设计器识别具体项类型
wpf设计器允许定义集合项的类型,如新发布的WPF的DataGrid控件,其中的Columns包括一下几种类型,Columns集合属性是以下几个类型的抽象类集合.要在设计器识别以下类型,就必须用到wpf设计时的扩展功能
实现这个功能很简单,只需要给该集合属性附上NewItemTypesAttribute元数据就好了.如下代码
NewItemTypesAttribute attr = new NewItemTypesAttribute(
typeof(DataGridTextColumn),
typeof(DataGridCheckBoxColumn),
typeof(DataGridHyperlinkColumn),
typeof(DataGridComboBoxColumn),
typeof(DataGridTemplateColumn));
builder.AddCustomAttributes("Columns", attr);
这里通过把元数据添加到元数据存储区的方式来实现,当然你也可以直接在属性上挂元数据,两种方法都可以,具体可以看第一篇的介绍.
2.格式化集合项属性
如上图,每个类型都配有不同的图标,这一功能需要NewItemFactory 来完成,称之为创建项的工厂,我理解为是格式化项.
NewItemFactory是一个抽象类,有三个虚方法
CreateInstance方法会在创建新实例时对该对象做一些业务逻辑的变更
GetDisplayName方法则获取显示的名称,如下图的DataGridTextColumn
GetImage方法则是获取显示的对象图标了,如下图左侧图标.
可以根据需要重写这三个方法.我们来看下DataGridColumnFactory是如何实现的.
internal class DataGridColumnFactory : NewItemFactory
{
public override object CreateInstance(Type type)
{
DataGridColumn gridColumn = null;
if (type.IsAssignableFrom(typeof(DataGridTemplateColumn)))
{
gridColumn = CreateTemplateColumn();
}
else
{
gridColumn = Activator.CreateInstance(type) as DataGridColumn;
}
if (gridColumn != null)
{
gridColumn.Header = "Header";
}
return gridColumn;
}
/// <summary>
/// Create a Template column with a default cell and editing template
/// </summary>
private static DataGridTemplateColumn CreateTemplateColumn()
{
DataGridTemplateColumn gridColumn = new DataGridTemplateColumn();
gridColumn.CellTemplate = new DataTemplate();
gridColumn.CellEditingTemplate = new DataTemplate();
return gridColumn;
}
public override object GetImage(Type type, Size desiredSize)
{
object image = base.GetImage(type, desiredSize);
if (typeof(DataGridTextColumn).IsAssignableFrom(type))
{
image = Util.GetImage("DataGridTextColumn.png", desiredSize);
}
else if (typeof(DataGridHyperlinkColumn).IsAssignableFrom(type))
{
image = Util.GetImage("DataGridHyperlinkColumn.png", desiredSize);
}
else if (typeof(DataGridComboBoxColumn).IsAssignableFrom(type))
{
image = Util.GetImage("DataGridComboBoxColumn.png", desiredSize);
}
else if (typeof(DataGridCheckBoxColumn).IsAssignableFrom(type))
{
image = Util.GetImage("DataGridCheckBoxColumn.png", desiredSize);
}
else if (typeof(DataGridTemplateColumn).IsAssignableFrom(type))
{
image = Util.GetImage("DataGridTemplateColumn.png", desiredSize);
}
return image;
}
}
以上代码应该很容易理解.定义好这个工厂类以后则需要用NewItemTypesAttribute中的FactoryType属性指定这个类型.现在刚开始的代码变更如下
NewItemTypesAttribute attr = new NewItemTypesAttribute(
typeof(DataGridTextColumn),
typeof(DataGridCheckBoxColumn),
typeof(DataGridHyperlinkColumn),
typeof(DataGridComboBoxColumn),
typeof(DataGridTemplateColumn));
attr.FactoryType = typeof(DataGridColumnFactory);
builder.AddCustomAttributes("Columns", attr);
上下文菜单项
在我们使用wpf的datagird时候,在选中DataGrid控件时,点击右键的话,会有一个自定义的DataGrid菜单,如下图
wpf设计器允许对控件提供自定义菜单项,这是通过继承一个名为PrimarySelectionContextMenuProvider的类实现的,上图的右键菜单由DataGridMenuProvider来实现,我们来看一下具体实现方法.如下
1.声明一个MenuGroup类,表明一个菜单项组,一个菜单则是一个MenuAction类.
通过MenuGroup的Items集合添加MenuAction.
2.更新菜单项状态UpdateItemStatus ,该事件会都目前的菜单进行判断,做出状态变更,如初始化并未显示Remove Columns这个菜单.
public DataGridMenuProvider()
{
// Set up the MenuGroup which holds the MenuAction items.
MenuGroup dataOperationsGroup = new MenuGroup("DataGroup", "DataGrid");
isDatasourceSetMenuAction = new MenuAction("You need to set ItemsSource to enable some column operations.");
generateStockColumnsMenuAction = new MenuAction("Generate Columns");
generateStockColumnsMenuAction.Execute += new EventHandler<MenuActionEventArgs>(GenerateStockColumnsMenuAction_Execute);
addColumnsMenuAction = new MenuAction("Add/Edit Columns...");
addColumnsMenuAction.Execute += new EventHandler<MenuActionEventArgs>(AddColumnsMenuAction_Execute);
removeColumnsMenuAction = new MenuAction("Remove Columns");
removeColumnsMenuAction.Execute += new EventHandler<MenuActionEventArgs>(RemoveColumnsMenuAction_Execute);
dataOperationsGroup.HasDropDown = true;
dataOperationsGroup.Items.Add(isDatasourceSetMenuAction);
dataOperationsGroup.Items.Add(generateStockColumnsMenuAction);
dataOperationsGroup.Items.Add(addColumnsMenuAction);
dataOperationsGroup.Items.Add(removeColumnsMenuAction);
this.Items.Add(dataOperationsGroup); // Can have groups - show up as sub menus
// The UpdateItemStatus event is raised immediately before
// the menu show, which provides the opportunity to set states.
UpdateItemStatus += new EventHandler<MenuActionEventArgs>(DataGridMenuProvider_UpdateItemStatus);
}
MenuAction可以通过Execute事件触发点击事件.这就可以使得运行时控件与设计器之间进行交互,这里涉及到一个wpf设计时的编辑模型放到下篇细讲.这篇就介绍集合项属性和自定义控件右键菜单的方法.下篇将会整理一个源码一起放上.
分享到:
相关推荐
在Windows Presentation Foundation (WPF) 中,...以上就是实现WPF控件拖动和位置交换的基本步骤,结合动画效果,可以提供更加流畅、用户友好的交互体验。在实际项目中,你可能需要根据具体需求进行适当的调整和优化。
总结,"WPF 自定义控件库 常用控件封装&常用控件样式重写"涉及到的核心技术包括WPF控件的封装、样式重写和控件库的构建,这些都是提升WPF应用界面设计和用户体验的关键手段。通过深入理解和运用这些知识,开发者能够...
综上所述,WPF控件库的重写和美化是一个涉及多方面技术的工作,包括但不限于控件继承、样式和模板定制、数据绑定、动画、响应式设计以及可访问性。这样的工作不仅可以提高应用的视觉吸引力,还能增强用户体验,是...
标题"**WPF控件大小随着窗体的改变而改变**"所提及的现象,是WPF布局系统的一个重要功能,它允许控件如Button等能够自动调整其大小以适应窗口尺寸的变化。这一特性使得开发的程序具有更好的用户体验,因为用户可以...
通过“WPF控件示例大全”提供的微软控件示例,开发者不仅可以了解这些概念,还能看到实际的代码示例,从而快速掌握WPF控件的使用方法,提升开发技能。实践中学习,理论与实践相结合,是成为WPF开发高手的关键步骤。
标题中的“WPF时间扩展控件支持时分秒”指的是一个特定的UI控件,它增强了WPF内置的时间选择功能,允许用户精确地选择和设置时间,包括小时、分钟和秒。这个控件对于需要进行时间输入的应用程序非常有用,例如日程...
WPF的样式和模板支持响应式设计,通过使用SizeToContent、MinWidth/MinHeight等属性,以及Adorner和Popup等辅助元素,可以创建适应不同屏幕尺寸和分辨率的界面。 总结来说,"WPF 控件样式大全" 提供了大量预设的...
在HandyControl中,所有原生WPF控件的样式都进行了重新设计,这意味着开发者可以使用这套库来实现更为现代、一致且吸引人的界面风格。这不仅提升了应用的视觉吸引力,也使开发者能够快速构建出符合最新设计趋势的...
2. `HandyControl.dll`:这是核心的开源控件库,包含了各种自定义的WPF控件,如按钮、表格、日历、进度条等。这些控件通常具有更丰富的样式和功能,超越了WPF框架自带的标准控件。 3. `System.Windows....
它们在设计时提供了丰富的功能和自定义选项,但在处理大量数据时,同步加载这些控件可能会导致UI冻结,因为所有操作都在主线程上执行。为了解决这个问题,WPF引入了异步编程模型,允许开发者在后台线程上执行耗时...
2. 创建WPF控件:首先,在WPF项目中创建一个UserControl或Control,这里可以利用WPF的强大特性,如数据绑定、样式和模板等,来设计你的控件。 3. 添加ElementHost到Winform:在Winform设计器中,从工具箱中拖放一个...
本篇将深入探讨WPF控件的简单布局。 1. **StackPanel布局** StackPanel是最基础的布局容器之一,它可以将子元素沿指定方向(水平或垂直)堆叠。当你希望控件按顺序排列,不考虑它们的大小时,StackPanel是个好选择...
Xceed.Wpf.Toolkit.dll是Xceed的工具包,包含了各种WPF控件和实用程序,这些可以帮助开发者快速构建用户界面,比如日期选择器、数字输入框等,提供了丰富的UI元素来满足不同需求。 Xceed.Wpf.AvalonDock.dll则是一...
WPF控件在WinForm中的使用,也被称为interop或混合编程,允许开发者利用WPF的强大功能,同时在现有的WinForm项目中保持兼容性。这个主题涉及到多个知识点,包括但不限于以下几点: 1. **WPF简介**:WPF是.NET ...
2. **模板化控件**: 自定义控件的一个关键部分是为其定义模板。我们可以使用ControlTemplate来定义控件的视觉结构和行为。这包括背景、边框、滑块等元素。对于旋钮控件,我们需要设计一个旋转的指针和一个可拖动的...
WPF是微软开发的一个用于构建桌面应用程序的技术,它提供了丰富的用户界面(UI)设计工具和功能,支持XAML语言进行声明式编程。 【描述】:“WPF控件代码大全(NET)” 这个描述暗示了资源包可能包含了一系列关于WPF...
首先,WPF控件的根类是System.Object,它是.NET框架中所有类的最终基类。从System.Object继承下来,首先是System.Windows.Threading.DispatcherObject,这个类与WPF的线程模型相关,用于确保UI线程的安全访问。紧...
Syncfusion WPF控件支持手势识别和优化的触摸界面,示例将解释如何启用这些功能。 10. **性能优化**:Syncfusion强调高性能和低内存占用,其控件通常经过优化以处理大数据量和复杂操作。开发者可以从示例中学习如何...
本压缩包文件“wpf控件例子”包含了个人整理的WPF控件示例,对于初学者来说是一个很好的学习资源。 **控件库**:WPF提供了一个庞大的控件库,包括按钮(Button)、文本框(TextBox)、标签(Label)、列表视图...
总的来说,WPF控件使用详解介绍了WPF的核心概念和操作方式,包括XAML的基本知识、控件的创建与实例化、控件外观的定制方法等。通过这些知识点,开发者可以灵活地在WPF中使用各种控件,构建出既美观又功能强大的...