Visual Studio не может разрешить статический ресурс в окне WPF, даже если он работает во время выполнения - почему? - PullRequest
5 голосов
/ 13 апреля 2011

У меня есть окно WPF, и я использую шаблон MVVM.Я установил модель представления в качестве ресурса для окна следующим образом ...

<Window
  ...other stuff removed for clarity...
  xmlns:mvvm="clr-namespace:VisionRT.CRM.WPF.ViewModels.VRTSystems"
>
<Window.Resources>
  <mvvm:DhrTemplatesViewModel x:Key="viewmodel" />
</Window.Resources>

Я хочу установить контекст данных окна для использования ресурса и обнаружил, что работает следующий XAML ...

  <Window.DataContext>  
    <StaticResource ResourceKey="viewmodel"/> 
  <Window.DataContext> 

Проблема в том, что я могу сделать это только набрав XAML вручную, Visual Studio нигде не показывает ресурс.Я могу перейти к свойствам окна и щелкнуть по маленькому значку рядом со свойством DataContext, выбрать опцию «Применить ресурс», но он не отображает «viewmodel» как ресурс, статический или динамический.Если я вхожу в XAML вручную, а затем открываю всплывающее окно «Применить ресурс», в нем указывается «viewmodel», как ошибка, и при наведении на него появляется всплывающая подсказка «не удается разрешить ссылку на ресурс»

ОднакоКогда я запускаю приложение, оно работает нормально, поэтому ресурс разрешается во время выполнения.

Кто-нибудь может объяснить это?Мне бы очень хотелось сделать это через редактор свойств VS, поскольку я считаю, что это более удобно, чем вводить XAMl вручную.Меня также беспокоит тот факт, что VS не может решить эту проблему.Это заставляет меня думать, что я делаю что-то не так.

Спасибо за любые объяснения, которые вы можете дать.

Ответы [ 2 ]

2 голосов
/ 20 января 2017

Возможно заставить Intellisense работать на 100% для XAML {StaticResource} в Visual Studio.

Проверено на

  • WPF / C #
  • Visual StudioОбновление 2015 3

Шаг 1. Смещение ресурсов в общий проект

Ключ заключается в том, чтобы переместить все ресурсы, на которые ссылается ResourceDictionary, в общий проект:

enter image description here

Шаг 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 должен был сканировать все родительские проекты (а не только ссылаться на ссылочные проекты).

2 голосов
/ 14 апреля 2011

Единственное (печальное) объяснение состоит в том, что XAML является гражданином второго класса в Visual Studio. Как только вы начинаете толкать XAML немного больше, чем просто, и у вас появляется «неразрешенный», «не могу отобразить», «извините, я тупой» и т.д.

Обратитесь к этому предложению WPF: http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/suggestions/480899-make-xaml-a-first-class-citizen-of-visual-studio?ref=title, чтобы исправить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...