Получить путь к каталогу xaml во время разработки - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть рабочий процесс с несколькими действиями, которые я редактирую на VS2017.Этот рабочий процесс находится здесь: C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml

Этот рабочий процесс заполнен действиями, одно из этих действий имеет тип MyPathActivity.Эта деятельность имеет кнопку.Когда эта кнопка нажата (во время разработки от ThisFile.xaml), я хочу, чтобы она показала MessageBox с текстом C:/Repo/Workflows/ProjectXyz/Foo/ThisFile.xaml, но я не знаю, как получить этот путь.

Как я могу получить путь к файлу xaml во время разработки?

Все, что я пробовал, привело меня к пути отладчика VS, корневому пути проекта, ... но мне нужнополный путь к xaml, который я редактирую.

1 Ответ

0 голосов
/ 27 ноября 2018

Мне удалось получить путь xaml:

Мы указываем на EditingContext (Context свойство ActivityDesigner), а затем на его Items свойство.Эти элементы являются коллекцией ContextItems следующих типов:

  • ReadOnlyState
  • 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

...