我们将讨论的是WF4属性窗格PropertyGrid扩展,Windows Workflow Foundation(WF),WF是一个通用的编程框架,它可用于创建需要对外部实体的信号作出响应的交互式程序。
本文将讲解的是WF4属性窗格PropertyGrid扩展,希望对大家了解Windows Workflow Foundation框架有所帮助。
#T#
1. 我们有一个CaryActivity活动如下:
- namespace CaryPropertyGridExten
- {
- public sealed class CaryActivity : CodeActivity
- {
- public InArgument Text { get; set; }
- public double RepeatCount { get; set; }
- public string FileName { get; set; }
- protected override void Execute(CodeActivityContext context)
- {
- }
- }
- }
2. 上面活动有RepeatCount和FileName属性,我们会为这两个属性在属性窗格的设置自定义属性值编辑器,要达到效果如下图:
3. 分别定义两个属性对应的属性值编辑器如下:
- namespace CaryPropertyGridExten
- {
- class CustomInlineEditor : PropertyValueEditor
{ public CustomInlineEditor() { this.InlineEditorTemplate = new DataTemplate(); FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel)); FrameworkElementFactory slider = new FrameworkElementFactory(typeof(Slider)); Binding sliderBinding = new Binding("Value"); sliderBinding.Mode = BindingMode.TwoWay; slider.SetValue(Slider.MinimumProperty, 0.0); slider.SetValue(Slider.MaximumProperty, 100.0); slider.SetValue(Slider.ValueProperty, sliderBinding); stack.AppendChild(slider); FrameworkElementFactory textb = new FrameworkElementFactory(typeof(TextBox)); Binding textBinding = new Binding("Value"); textb.SetValue(TextBox.TextProperty, textBinding); textb.SetValue(TextBox.IsEnabledProperty, false); stack.AppendChild(textb); this.InlineEditorTemplate.VisualTree = stack; } } } namespace CaryPropertyGridExten { class FilePickerEditor : DialogPropertyValueEditor { public FilePickerEditor() { this.InlineEditorTemplate = new DataTemplate(); FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel)); stack.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); FrameworkElementFactory label = new FrameworkElementFactory(typeof(Label)); Binding labelBinding = new Binding("Value"); label.SetValue(Label.ContentProperty, labelBinding); label.SetValue(Label.MaxWidthProperty, 90.0); stack.AppendChild(label); FrameworkElementFactory editModeSwitch = new FrameworkElementFactory(typeof(EditModeSwitchButton)); editModeSwitch.SetValue(EditModeSwitchButton.TargetEditModeProperty, PropertyContainerEditMode.Dialog); stack.AppendChild(editModeSwitch); this.InlineEditorTemplate.VisualTree = stack; } public override void ShowDialog(PropertyValue propertyValue, IInputElement commandSource) { Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog(); if (ofd.ShowDialog() == true) { propertyValue.Value = ofd.FileName.Substring(ofd.FileName.LastIndexOf('\\') + 1); } } } }
4. 在CaryActivity的构造函数中增加自定义属性的信息如下,关于AttributeTableBuilder及MetadataStore的使用可参考关于元数据存储区MetadateStore及AttributeTableBuilder这篇文章。
- public CaryActivity()
- {
- AttributeTableBuilder builder = new AttributeTableBuilder();
builder.AddCustomAttributes(typeof(CaryActivity), "RepeatCount", new EditorAttribute(typeof(CustomInlineEditor), typeof(PropertyValueEditor))); builder.AddCustomAttributes(typeof(CaryActivity), "FileName", new EditorAttribute(typeof(FilePickerEditor), typeof(DialogPropertyValueEditor))); MetadataStore.AddAttributeTable(builder.CreateTable()); }
原文标题:WF4:属性窗格PropertyGrid扩展
链接:http://www.cnblogs.com/carysun/archive/2009/11/30/WF4-PropertyGridExten.html