博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

WF4:属性窗格PropertyGrid扩展

Posted on 2009-11-30 21:09  生鱼片  阅读(2510)  评论(2编辑  收藏  举报

1.       我们有一个CaryActivity活动如下:

namespace CaryPropertyGridExten

{

    public sealed class CaryActivity : CodeActivity

    {       

        public InArgument<string> Text { get; set; }

        public double RepeatCount { get; set; }

        public string FileName { get; set; }          

        protected override void Execute(CodeActivityContext context)

        {                      

        }

    }

}

2.       上面活动有RepeatCountFileName属性,我们会为这两个属性在属性窗格的设置自定义属性值编辑器要达到效果如下图:

clip_image002

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的构造函数中增加自定义属性的信息如下,关于AttributeTableBuilderMetadataStore的使用可参考关于元数据存储区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());

        }  

 

例子来源:WF_WCF_Samples