我试图在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
而且没有任何区别。
答案 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();
}
}
,但有几点需要注意:
重要的&#39; XAML
构造函数中包含的代码是:
Activity
TargetPath表示将在AttributeTableBuilder builder = new AttributeTableBuilder();
builder.AddCustomAttributes(typeof(CopyMoveFiles), "TargetPath",
new EditorAttribute(
typeof(BrowseForFolderEditor),
typeof(DialogPropertyValueEditor)));
MetadataStore.AddAttributeTable(builder.CreateTable());
显示的字符串属性。
肯定有改进的余地,但这是一个开始,似乎工作得很好。值得一提的是,添加各种参考资料是一种痛苦。我不能再浪费时间了,但即使在按照微软项目添加所有参考资料之后,它仍然无法工作,最终也没有,所以我还是不确定为什么这发生了,这是一种耻辱,但如果有人试一试,并能确定哪个参考给他们带来麻烦,我有兴趣知道。
希望这有帮助。
<强>更新强>
如果您不想在构造函数中以编程方式定义属性,则只需使用以下属性:
PropertyGrid