在设计时获取 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.xamlMessageBox,但我不知道如何获取该路径。

如何在设计时获取 xaml 文件的路径?

我尝试过的所有操作都让我进入了 VS 调试器路径、项目的根路径...但我需要我正在编辑的 xaml 的完整路径。

我已经设法获得 xaml 路径:

我们指向EditingContextActivityDesignerContext属性)然后指向它的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