在设计时获取 xaml 目录路径
Get xaml directory path at design time
我有一个包含多个活动的工作流,我正在 VS2017 上进行编辑。这个工作流程在这里:
C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml
此工作流填充了活动,其中一个活动的类型为 MyPathActivity
。这个 activity 有一个按钮。单击该按钮时(在 ThisFile.xaml
的设计时),我希望它显示带有文本 C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml
的 MessageBox
,但我不知道如何获取该路径。
如何在设计时获取 xaml 文件的路径?
我尝试过的所有操作都让我进入了 VS 调试器路径、项目的根路径...但我需要我正在编辑的 xaml 的完整路径。
我已经设法获得 xaml 路径:
我们指向EditingContext
(ActivityDesigner
的Context
属性)然后指向它的Items
属性。这些项目是这些类型的 ContextItems 的集合:
- 只读状态
- AssemblyContextControlItem
- WorkflowCommandExtensionItem
- WorkflowFileItem
- 选择
现在 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
我有一个包含多个活动的工作流,我正在 VS2017 上进行编辑。这个工作流程在这里:
C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml
此工作流填充了活动,其中一个活动的类型为 MyPathActivity
。这个 activity 有一个按钮。单击该按钮时(在 ThisFile.xaml
的设计时),我希望它显示带有文本 C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml
的 MessageBox
,但我不知道如何获取该路径。
如何在设计时获取 xaml 文件的路径?
我尝试过的所有操作都让我进入了 VS 调试器路径、项目的根路径...但我需要我正在编辑的 xaml 的完整路径。
我已经设法获得 xaml 路径:
我们指向EditingContext
(ActivityDesigner
的Context
属性)然后指向它的Items
属性。这些项目是这些类型的 ContextItems 的集合:
- 只读状态
- AssemblyContextControlItem
- WorkflowCommandExtensionItem
- WorkflowFileItem
- 选择
现在 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