- wpf设计时调试
- 编辑模型
- 装饰器
1.wpf设计时调试
为了更好的了解wpf设计时框架,那么调试则非常重要,通过以下配置可以调试控件的设计时代码
(1)将启动项目配置成外部的visual studio ide启动程序devenv.exe
(2)F5启动调试然后会打开一个新的visual studio ide,这个时候要记得重新打开你要调试的那个项目.
以上两个步骤就可以实现设计时调试了
2.编辑模型体系
当选中某些控件出现的设计时,这个选中的控件便成了可编辑的对象. 设计环境会传回一个ModelItem的类,这个类可以帮助你更改控件视图,用于交互.这里的做法与直接更改wpf控件有些不同,如直接改变wpf一个控件的一个属性
this.Content = "Hello";
在设计环境下,也可以获取到处在编辑状态的控件,若采取上面的做法,虽可以变更控件的视图,但却未变更控件在xaml的更改.
设计环境下所有控件的更改都封装在ModelItem类中.做法如下
//selectedContent's Type is ModelItem selectedContent.Properties["Content"].SetValue("Hello"); //selectedContent.Properties[ContentControl.ContentProperty].SetValue("Hello");
selectedContent类型是ModelItem,其中用Properties索引值获取属性,有两种方式获取属性,字符串和静态项属性
在上篇介绍过控件上下文菜单的设计时做法,我们以此为基础做个示例,以ContentControl为例,如下图
共有4个操作,SetHello和SetRedForeground用于测试ModelItem变更控件视图的功能,
第三个和第四个菜单用于测试变更时事务的操作.(即要么全过,要么全不过)
以下为详细代码
public class ContentMenuProvider : PrimarySelectionContextMenuProvider { //略去构造函数添加MenuAcion的代码
void ModelEditingScopeFailMenuAction_Execute(object sender, MenuActionEventArgs e) { ModelItem selectedContent = e.Selection.PrimarySelection; using (ModelEditingScope scope = selectedContent.BeginEdit("test")) { //selectedContent's Type is ModelItem selectedContent.Properties["Content"].SetValue("TextModelEditingScope"); //wrong selectedContent.Properties["Foreground"].SetValue("Red"); scope.Complete(); } } void ModelEditingScopeMenuAction_Execute(object sender, MenuActionEventArgs e) { ModelItem selectedContent = e.Selection.PrimarySelection; using (ModelEditingScope scope = selectedContent.BeginEdit("test")) { selectedContent.Properties["Content"].SetValue("TextModelEditingScope"); selectedContent.Properties["Foreground"].SetValue(Brushes.Green); scope.Complete(); } } void SetRedForegroundMenuAction_Execute(object sender, MenuActionEventArgs e) { ModelItem selectedContent = e.Selection.PrimarySelection; selectedContent.Properties["Foreground"].SetValue(Brushes.Red); selectedContent.Properties[Control.ForegroundProperty].SetValue(Brushes.Red); } void SetHelloMenuAction_Execute(object sender, MenuActionEventArgs e) { ModelItem selectedContent = e.Selection.PrimarySelection; //ContentControl element = selectedContent.View as ContentControl; //selectedContent.Content = "hello"; selectedContent.Properties["Content"].SetValue("Hello"); } }
这里ModelItem通过MenuActionEventArgs传递进来.当需要事务支持时,则需要用到ModelEditingScope对象,通过ModelItem的BeginEdit方法,当全部变更完成时,则调用ModelEditingScope的Complete方法.
这里可以知道ModelItem是设计器对控件做出所有的变更的一个封装,也是wpf控件设计器的一个基础.上面介绍通过Properties索引值变更视图,具体ModelItem其他的功能可以参考msdn相关文档.
3.装饰器
上图是asp.net里面GridView控件的一个设计视图,右侧的可视化面板到了wpf控件的设计时就称为装饰器,那么这个装饰器其实就是wpf的控件,实现可视化界面对于使用者而言非常重要,可以了解该控件的常用功能,也省却了一些开发时间.不过目前wpf内置控件似乎没一个控件是具有这一功能的,只能希望下版visual studio对wpf控件时做的更好了,可怕的是我们自己无法扩展内置控件的设计时,只能等着微软来做,最可怕的是visual studio 2010把wpf设计时部分的api全变掉,那么这里就全白写了.
装饰器功能由AdornerProvider提供,我们从内置提供的PrimarySelectionAdornerProvider类派生一个装饰器.
派生类需要重写以上两个方法,当选中该设计器相关控件时,会调用Activate方法,离开时调用Deactivate方法.为了介绍装饰器的使用方法.示例将尽量简单,以介绍装饰器功能.
一般情况下,装饰器需要一下几个步骤
(1)定义一个AdornerPanel对象,并把控件相关装饰器添加到AdornerPanel中,然后将这个装饰器容器添加到AdornerProvider的Adorners属性中,这项操作在Activate方法中完成.
protected override void Activate(ModelItem item, DependencyObject view) { Slider opacitySlider = new Slider(); opacitySlider.Background = Brushes.Red; AdornerPanel myPanel = new AdornerPanel(); myPanel.Children.Add(opacitySlider); Adorners.Add(myPanel); base.Activate(item, view); }
注意Activate方法也将ModelItem传递进来,就意味着通过装饰器的方式也可以变更控件视图
(2)定位装饰器
再来看asp.net的GridView的设计时面板,其出现在控件的右侧,wpf设计时装饰器体系允许变更装饰器位置,上面做的第一个步骤并无法在视图上看到控件的装饰器,那是因为装饰器的定位问题.这个步骤必须完成.
这项工作由AdornerPlacementCollection对象来完成,再通过AdornerPanel的静态方法SetPlacements来设置装饰器的位置.
我们来看一下AdornerPlacementCollection的几个方法,初看会比较晕,无法判断几个方法的区别
以上8个方法可以看做4个方法,都是与高度宽度有关的.下面以图来说明,我们定义的控件装饰器是一个Slider控件.目前只用于演示作用,它做不了什么其他事情.
以上是原控件,装饰器建立在此基础之上,这里说明一下上面8个方法的参数,都是一致的,第一个是倍数因子,第二个偏移量
(1)设置容器大小
为了演示,所以装饰器控件以红色背景标记,以下代码添加在Activate方法后面,SizeRelativeToContentWidth && Height方法设置装饰器容器的大小,设置宽度和高度为控件内容高度和宽度的1倍
相应代码
AdornerPlacementCollection placement = new AdornerPlacementCollection(); placement.SizeRelativeToContentWidth(1, 0); placement.SizeRelativeToContentHeight(1, 0); AdornerPanel.SetPlacements(opacitySlider, placement);
(2)变更装饰器位置(PositionRelativeToAdornerWidth方法),倍数参数为正数则向右移,负数则向左移
代码变更为
AdornerPlacementCollection placement = new AdornerPlacementCollection(); placement.SizeRelativeToContentWidth(1, 0); placement.SizeRelativeToContentHeight(1, 0); placement.PositionRelativeToAdornerWidth(1, 0); AdornerPanel.SetPlacements(opacitySlider, placement);
(3)DesiredWidth和DesiredHeight,注意在设计时,控件与容器之间也有着间距,如下红圈
SizeRelativeToAdornerDesiredWidth方法用于调整装饰器的DesiredWidth.看下图黄色红圈的位置变更,装饰器向右侧移动一个DesiredWidth,并宽度添加一个DesiredWidth.
代码变更为
AdornerPlacementCollection placement = new AdornerPlacementCollection(); placement.SizeRelativeToContentWidth(1, 0); placement.SizeRelativeToContentHeight(1, 0); placement.PositionRelativeToAdornerWidth(1, 0); placement.SizeRelativeToAdornerDesiredWidth(1, 0); AdornerPanel.SetPlacements(opacitySlider, placement);
注意PositionRelativeToAdornerWidth方法变更为PositionRelativeToContentWidth方法,那么SizeRelativeToAdornerDesiredWidth方法只会使装饰器宽度变更,而位置则不做变更.如下图
代码变更为
AdornerPlacementCollection placement = new AdornerPlacementCollection(); placement.SizeRelativeToContentWidth(1, 0); placement.SizeRelativeToContentHeight(1, 0); //placement.PositionRelativeToAdornerWidth(1, 0); placement.PositionRelativeToContentWidth(1, 0); placement.SizeRelativeToAdornerDesiredWidth(5, 0); AdornerPanel.SetPlacements(opacitySlider, placement);
一边情况下不设置容器高度,因为控件的高度是不确定的,所以现在调整如下
现在最终代码变更为
AdornerPlacementCollection placement = new AdornerPlacementCollection(); placement.SizeRelativeToContentWidth(1, 0); placement.PositionRelativeToAdornerWidth(1, 0); placement.SizeRelativeToAdornerDesiredHeight(1, 0); AdornerPanel.SetPlacements(opacitySlider, placement);
上面方法可以做多次尝试,便于好的理解.
过年在家写的,比较乱,没有全部介绍完整.接着继续写.
发表评论
-
wpf开发常见问题(1)
2008-10-22 21:42 1589经过一段时间wpf的学习和实际开发.现在与大家分享 ... -
初始化集合项依赖属性
2008-11-03 13:38 810在wpf自定义属性时,若此属性为集合类型的话,如 ... -
WPF and SL RadioButtonList Tip
2008-11-03 14:03 802在以下情境下.使用数据绑定分离UI与后端Model ... -
wpf datagrid笔记 part 1
2008-12-10 23:35 28901,基本属性 开关基本 ... -
Prism V2之旅(2)
2009-01-07 10:02 1159本篇将介绍Prism中Region的使用. 本篇D ... -
Prism V2之旅(3)
2009-01-07 15:24 857上篇介绍了Region的基本应用,这篇接上篇,继续介绍 ... -
Prism V2之旅(4)
2009-01-07 23:42 941上篇介绍了RegionAdapter的作用及如何如何 ... -
Prism V2之旅(5)
2009-01-13 11:54 1093上篇介绍了WPF的Attach Behavior(附加行 ... -
Prism V2之旅(6)
2009-01-13 15:14 1030这篇来讲事件.事件主要用来交互. 监听事件 我订 ... -
prism v2之旅(7)
2009-01-15 23:53 1139这篇继续介绍Module的功能. 第5篇已经介绍过模块的 ... -
XAML Guidelines
2009-01-17 11:31 835http://blogs.msdn.com/jaimer ... -
wpf中xaml的类型转换器与标记扩展
2009-02-02 14:03 2334这篇来讲wpf控件属性的类型转换器 类型转换器 类 ... -
wpf控件样式管理示意图
2009-02-04 14:40 1643...
相关推荐
总结,"WPF 自定义控件库 常用控件封装&常用控件样式重写"涉及到的核心技术包括WPF控件的封装、样式重写和控件库的构建,这些都是提升WPF应用界面设计和用户体验的关键手段。通过深入理解和运用这些知识,开发者能够...
在Windows Presentation Foundation (WPF) 中,...以上就是实现WPF控件拖动和位置交换的基本步骤,结合动画效果,可以提供更加流畅、用户友好的交互体验。在实际项目中,你可能需要根据具体需求进行适当的调整和优化。
综上所述,WPF控件库的重写和美化是一个涉及多方面技术的工作,包括但不限于控件继承、样式和模板定制、数据绑定、动画、响应式设计以及可访问性。这样的工作不仅可以提高应用的视觉吸引力,还能增强用户体验,是...
标题"**WPF控件大小随着窗体的改变而改变**"所提及的现象,是WPF布局系统的一个重要功能,它允许控件如Button等能够自动调整其大小以适应窗口尺寸的变化。这一特性使得开发的程序具有更好的用户体验,因为用户可以...
通过“WPF控件示例大全”提供的微软控件示例,开发者不仅可以了解这些概念,还能看到实际的代码示例,从而快速掌握WPF控件的使用方法,提升开发技能。实践中学习,理论与实践相结合,是成为WPF开发高手的关键步骤。
标题中的“WPF时间扩展控件支持时分秒”指的是一个特定的UI控件,它增强了WPF内置的时间选择功能,允许用户精确地选择和设置时间,包括小时、分钟和秒。这个控件对于需要进行时间输入的应用程序非常有用,例如日程...
WPF的样式和模板支持响应式设计,通过使用SizeToContent、MinWidth/MinHeight等属性,以及Adorner和Popup等辅助元素,可以创建适应不同屏幕尺寸和分辨率的界面。 总结来说,"WPF 控件样式大全" 提供了大量预设的...
2. `HandyControl.dll`:这是核心的开源控件库,包含了各种自定义的WPF控件,如按钮、表格、日历、进度条等。这些控件通常具有更丰富的样式和功能,超越了WPF框架自带的标准控件。 3. `System.Windows....
它们在设计时提供了丰富的功能和自定义选项,但在处理大量数据时,同步加载这些控件可能会导致UI冻结,因为所有操作都在主线程上执行。为了解决这个问题,WPF引入了异步编程模型,允许开发者在后台线程上执行耗时...
通过上述步骤,你就可以在Winform应用程序中使用WPF控件,充分利用WPF的丰富功能和美观的UI设计,同时保持Winform的开发效率和兼容性。这在需要升级旧有Winform应用或者需要特定UI功能时尤其有用。 在提供的`...
WPF是微软开发的一个用于构建桌面应用程序的技术,它提供了丰富的用户界面(UI)设计工具和功能,支持XAML语言进行声明式编程。 【描述】:“WPF控件代码大全(NET)” 这个描述暗示了资源包可能包含了一系列关于WPF...
本篇将深入探讨WPF控件的简单布局。 1. **StackPanel布局** StackPanel是最基础的布局容器之一,它可以将子元素沿指定方向(水平或垂直)堆叠。当你希望控件按顺序排列,不考虑它们的大小时,StackPanel是个好选择...
Xceed.Wpf.Toolkit.dll是Xceed的工具包,包含了各种WPF控件和实用程序,这些可以帮助开发者快速构建用户界面,比如日期选择器、数字输入框等,提供了丰富的UI元素来满足不同需求。 Xceed.Wpf.AvalonDock.dll则是一...
3. **Interop技术**:为了在WinForm中使用WPF控件,.NET Framework提供了一种叫做Windows Forms Hosting WPF Controls(WinForms宿主WPF控件)的技术。这使得开发者可以将WPF控件嵌入到WinForm窗体中,利用WPF的特性...
3. **依赖属性**: 依赖属性是WPF中用于控件属性的主要机制。它们支持数据绑定、动画和样式设置。在创建自定义控件时,我们需要定义自己的依赖属性,如旋转角度、旋转速度等,以供外部使用和交互。 4. **事件处理**:...
首先,WPF控件的根类是System.Object,它是.NET框架中所有类的最终基类。从System.Object继承下来,首先是System.Windows.Threading.DispatcherObject,这个类与WPF的线程模型相关,用于确保UI线程的安全访问。紧...
总的来说,WPF控件使用详解介绍了WPF的核心概念和操作方式,包括XAML的基本知识、控件的创建与实例化、控件外观的定制方法等。通过这些知识点,开发者可以灵活地在WPF中使用各种控件,构建出既美观又功能强大的...
本压缩包文件“wpf控件例子”包含了个人整理的WPF控件示例,对于初学者来说是一个很好的学习资源。 **控件库**:WPF提供了一个庞大的控件库,包括按钮(Button)、文本框(TextBox)、标签(Label)、列表视图...
6. **响应式设计**:考虑到不同屏幕尺寸和分辨率,好的WPF电表控件应支持响应式布局,确保在各种设备上都能良好显示。 7. **性能优化**:由于电表控件可能需要频繁更新数据,因此其性能优化至关重要,避免对整体...
总之,创建一个自定义的WPF搜索控件需要对WPF控件系统有深入理解,包括模板设计、依赖属性、事件处理和数据绑定。通过这个示例,开发者可以学习到自定义控件开发的整个过程,并将其应用于自己的项目,提升用户体验。