Windows Workflow Designer 4.5中的UITypeEditor(浏览文件夹)

时间:2016-09-19 10:50:13

标签: c# workflow-foundation-4 workflow-foundation uitypeeditor

我试图在WF 4.5工作流活动中实现Browse for文件夹,但省略号按钮没有显示,几乎没有任何反应。

这是我的UITypeEditor类:

public class BrowseForFolderEditor : UITypeEditor
{
    public override object EditValue(ITypeDescriptorContext context, 
         IServiceProvider provider, object value)
    {
        string folderName = string.Empty;
        BrowseForFolderAttribute browseForFolderAttribute = null;

        if (value is string)
        {
            if (context?.PropertyDescriptor != null)
            {
                browseForFolderAttribute =
                    (BrowseForFolderAttribute)
                context.PropertyDescriptor.Attributes[typeof(BrowseForFolderAttribute)];
            }

            var browse = new FolderBrowserDialogEx
            {
                Description = browseForFolderAttribute?.Description,
                ShowNewFolderButton = true,
                ShowEditBox = true,
                SelectedPath = folderName,
                ShowFullPathInEditBox = false,
                RootFolder = Environment.SpecialFolder.MyComputer
            };

            var result = browse.ShowDialog();

            if (result == DialogResult.OK)
                folderName = browse.SelectedPath;

            return folderName;
        }

        // Return whatever value if it wasn't a string - Should never occur!
        return value;
    }

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal; //base.GetEditStyle(context);
    }

    public class BrowseForFolderAttribute : Attribute
    {
        public BrowseForFolderAttribute(string description)
        {
            this.Description = description;
        }

        public string Description { get; set; }
    }
}

这就是我在Activity中声明代码的方式:

    [Description("Select the folder where the files will be 
     copied/moved to.")]
    [Category("Folders")]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [BrowseForFolderEditor.BrowseForFolder("Select the folder where the files will be 
     copied/moved to.")]
    [Editor(typeof(BrowseForFolderEditor), typeof(UITypeEditor))]
    public string TargetPath { get; set; }

我不知道它是否有所不同,但我的工作流Activity属于NativeActivity类型。

该属性显示在属性网格中,但它只显示为没有省略号按钮的文本框。

任何帮助都将不胜感激。

UPDATE-1:

这个问题与NativeCodeActivity这个事实无关,因为我只是将我的代码更改为CodeActivity而且没有任何区别。

1 个答案:

答案 0 :(得分:1)

我通过查看Microsoft提供的一些示例(即Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4

)来解决这个问题

无论如何,根据这些信息,我设法在文本框太短而无法显示路径的情况下显示省略号按钮(' ...'),文本框和工具提示。它还不完美,因为我正在寻找如何添加其他属性来设置' BrowseForFolder'的其他属性。对话,但我想我会分享我的发现。

我的编辑器定义如下:

&&

我不会详细了解public class BrowseForFolderEditor : DialogPropertyValueEditor { public BrowseForFolderEditor() { // Create a textbox, a '...' button and a tooltip. string template = @" <DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:pe='clr-namespace:System.Activities.Presentation.PropertyEditing;assembly=System.Activities.Presentation'> <DockPanel LastChildFill='True'> <pe:EditModeSwitchButton TargetEditMode='Dialog' Name='EditButton' DockPanel.Dock='Right'>...</pe:EditModeSwitchButton> <TextBlock Text='{Binding Value}' Margin='2,0,0,0' VerticalAlignment='Center'> <TextBox.ToolTip> <ToolTip> <TextBlock Text='{Binding Value}' Margin='2' VerticalAlignment='Center' HorizontalAlignment='Left'/> </ToolTip> </TextBox.ToolTip> </TextBlock> </DockPanel> </DataTemplate>"; using (var sr = new MemoryStream(Encoding.UTF8.GetBytes(template))) { this.InlineEditorTemplate = XamlReader.Load(sr) as DataTemplate; } } public override void ShowDialog(PropertyValue propertyValue, IInputElement commandSource) { var browse = new FolderBrowserDialog { ShowNewFolderButton = true, SelectedPath = propertyValue.StringValue, Description = "Select Target Folder:", RootFolder = Environment.SpecialFolder.MyComputer }; if (browse.ShowDialog() == DialogResult.OK) { propertyValue.Value = browse.SelectedPath; } browse.Dispose(); } } ,但有几点需要注意:

  1. 如何设置InlineEditorTemplate,即将其设置为字符串中预定义的XAML。
  2. TextBox的绑定,即值
  3. 工具提示的绑定,即值
  4. 重要的&#39; XAML构造函数中包含的代码是:

    Activity

    TargetPath表示将在AttributeTableBuilder builder = new AttributeTableBuilder(); builder.AddCustomAttributes(typeof(CopyMoveFiles), "TargetPath", new EditorAttribute( typeof(BrowseForFolderEditor), typeof(DialogPropertyValueEditor))); MetadataStore.AddAttributeTable(builder.CreateTable()); 显示的字符串属性。

    肯定有改进的余地,但这是一个开始,似乎工作得很好。值得一提的是,添加各种参考资料是一种痛苦。我不能再浪费时间了,但即使在按照微软项目添加所有参考资料之后,它仍然无法工作,最终也没有,所以我还是不确定为什么这发生了,这是一种耻辱,但如果有人试一试,并能确定哪个参考给他们带来麻烦,我有兴趣知道。

    希望这有帮助。

    <强>更新

    如果您不想在构造函数中以编程方式定义属性,则只需使用以下属性:

    PropertyGrid