0

Я пытаюсь реализовать папку «Обзор» в WF 4.5 Workflow Activity, но кнопка с эллипсами не отображается, и почти ничего не происходит.UITypeEditor в Windows Workflow Designer 4.5 (Просмотр папки)

Это мой 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.

Свойство отображается в сетке свойств, но оно просто отображается как текстовое поле без кнопки эллипса.

Любая помощь будет оценена по достоинству.

ДОПОЛНЕНО-1:

Проблема не имеет ничего общего с тем, что это NativeCodeActivity как я только изменил мой код CodeActivity и это не имело никакого значения.

ответ

1

Я понял это, посмотрев на некоторых образцах, предоставленных Microsoft т.е. Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4

Во всяком случае, на основе этой информации, мне удалось отобразить кнопку с многоточием («...»), текстовое поле и всплывающую подсказку в событие, когда текстовое поле слишком короткое для отображения пути. Это еще не так просто, поскольку я ищу, как добавить дополнительные атрибуты для установки других свойств диалогового окна «ОбзорForFolder», но я решил поделиться своими выводами.

Мой редактор определяется следующим образом:

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(); 
    } 
} 

Я не буду вдаваться в слишком много подробностей о XAML, но несколько вещей, чтобы заметить:

  1. Как InlineEditorTemplate установлен т.е. установив его в XAML, который предопределен в строке.
  2. Связывание TextBox то есть стоимость
  3. связывания

The 'важного' код подсказка т.е. Value, который содержится в Activity конструктора:

AttributeTableBuilder builder = new AttributeTableBuilder(); 

builder.AddCustomAttributes(typeof(CopyMoveFiles), "TargetPath", 
      new EditorAttribute(
      typeof(BrowseForFolderEditor), 
      typeof(DialogPropertyValueEditor))); 

MetadataStore.AddAttributeTable(builder.CreateTable()); 

Если TargetPath представляет свойство строки который будет отображаться в PropertyGrid.

Существует определенная возможность для улучшения, но это начало и, похоже, работает очень хорошо. Стоит упомянуть, что добавление различных ссылок было болью. Я не могу больше тратить время на это, но даже после добавления всех ссылок в соответствии с проектом Microsoft это все равно не сработает, и в конце концов это произойдет, поэтому я до сих пор не знаю, почему это произошло, что является позором но если кто-нибудь попробует это и сможет определить, какая из этих ссылок дала им проблемы, мне было бы интересно узнать.

Надеюсь, это поможет.

Обновление:

Если вы не хотите, чтобы определить атрибуты программно в конструкторе, вы можете просто использовать атрибуты:

[Editor(typeof(BrowseForFolderEditor), typeof(DialogPropertyValueEditor))] 
public string TargetPath { get; set; } 

 Смежные вопросы

  • Нет связанных вопросов^_^