【问题标题】:Get xaml directory path at design time在设计时获取 xaml 目录路径
【发布时间】:2018-11-27 12:12:59
【问题描述】:
我有一个包含多个活动的工作流,我正在 VS2017 上进行编辑。这个工作流程在这里:
C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml
此工作流填充有活动,其中一个活动的类型为 MyPathActivity。这个活动有一个按钮。单击该按钮时(在设计时从 ThisFile.xaml 开始),我希望它显示带有文本 C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml 的 MessageBox,但我不知道如何获取该路径。
如何在设计时获取 xaml 文件的路径?
我所做的一切都让我进入了 VS 调试器路径、项目的根路径……但我需要我正在编辑的 xaml 的完整路径。
【问题讨论】:
标签:
c#
wpf
xaml
workflow-foundation
【解决方案1】:
我已经设法获得了 xaml 路径:
我们指向EditingContext(ActivityDesigner 的Context 属性),然后指向它的Items 属性。这些项目是这些类型的 ContextItems 的集合:
- 只读状态
- AssemblyContextControlItem
- WorkflowCommandExtensionItem
- 工作流文件项
- 选择
现在 WorkflowFileItem 听起来很像有用的东西 =)
指向我们得到的那个项目的属性LoadedFile:
C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml
万岁!
现在是代码:
public static class DesignerUtils
{
public static string GetXamlPathFromActivityDesignerElement<TActivityDesigner
(TActivityDesigner designer) where TActivityDesigner : ActivityDesigner
{
EditingContext editingContext = designer.Context;
ContextItemManager items = editingContext.Items;
WorkflowFileItem fileItem = (WorkflowFileItem)items
.SingleOrDefault(item => item is WorkflowFileItem);
return fileItem.LoadedFile;
}
}
这里在点击处理程序中的使用:
public void OnPathButtonClick(object sender, RoutedEventArgs e)
{
string xamlPath = DesignerUtils
.GetXamlPathFromActivityDesignerElement<MyPathActivityDesigner>
(sender as FrameworkElement);
MessageBox.Show(xamlPath);
}
编辑:第一个版本需要事件发送者。这是一个完全不必要的步骤,因为我们已经让设计师使用this