Мне удалось получить путь 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