Возможно заставить Intellisense работать на 100% для XAML {StaticResource}
в Visual Studio.
Проверено на
- WPF / C #
- Visual StudioОбновление 2015 3
Шаг 1. Смещение ресурсов в общий проект
Ключ заключается в том, чтобы переместить все ресурсы, на которые ссылается ResourceDictionary
, в общий проект:
Шаг 2: Intellisense времени проектирования
Мы еще не совсем там.Среда выполнения XAML выбрасывает среду выполнения, если вы включаете ресурсы дважды.
Если мы включаем файл .xaml более одного раза во весь проект, мы можем включить его во время разработки, но не во время выполнения:
public class DesignTimeResourceDictionary : ResourceDictionary
{
private Uri source;
public new Uri Source
{
get
{
if ((bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)
{
return null;
}
return this.source;
}
set { this.source = value; }
}
}
Затем мы можем добавить ресурсы времени разработки:
<!--Design time resource dictionary, so intellisense will work with with {StaticResource}.-->
<ResourceDictionary.MergedDictionaries>
<dr:DesignTimeResourceDictionary Source="/Project.Name;component/Folder/SharedResourceA.xaml" />
<dr:DesignTimeResourceDictionary Source="/Project.Name;component/Folder/SharedResourceB.xaml" />
</ResourceDictionary.MergedDictionaries>
Если мы используем ReSharper, он предложит автоматически добавить префикс пространства имен в заголовок:
xmlns:dr="clr-namespace:MyNamespace;assembly=Project.Name"
Приложение A: Дополнительная информация для экспертов: зачем нужен Шаг 1?
Кроме того, Intellisense в XAML - это то же самое, что Intellisense в C #: он работает только с подпроектами, на которые есть ссылки.Вот почему, если проекты A и B хотят совместно использовать некоторый код, вы должны поместить его в библиотеку классов C, на которую ссылаются проекты A и B. Это отличается от C или C ++, где #include в корне делает егодоступны для всех подфайлов.
С XAML вы можете использовать читы и добавлять статические ресурсы в Main Application Project
(выше), и среда выполнения XAML все равно будет работать должным образом - но Intellisense не будет работать во время разработки, предположительно какон основан на том же движке, который используется для C # intellisense.
Чтобы Intellisense все время работал в XAML, Visual Studio Intellisense должен был сканировать все родительские проекты (а не только ссылаться на ссылочные проекты).