nmeri17 Ответов: 2

Могу ли я ссылаться на классы, отличные от WPF, в файле ресурсов?


Я заметил, что могу ссылаться на пространства имен в другом проекте (the вид папка в mvvm), но пространства имен и классы в модели родственного представления и папках моделей недоступны, даже если я ввожу их вручную, он утверждает, что они не существуют.

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

Что я уже пробовал:

Я добавил все 3 текущих проекта в справочнике проектов. Как я могу получить доступ к этим папкам? В чем может быть проблема? Большое спасибо.

Файлы проекта можно найти здесь Dirkstar99.7z - Google Диск[^]

2 Ответов

Рейтинг:
17

Dirk Bahle

Можете ли вы показать некоторые примеры кода?

Скорее всего, вам не хватает такой ссылки на сборку:

xmlns:conv="clr-пространство имен:MRULib.Converters;assembly=MRULib"

как показано здесь:
MRULib/MainWindow.xaml в master · Dirkster99/MRULib · GitHub[^]

Но я не могу сказать, так как вы не публикуете образец кода :-(


nmeri17

Привет. Так что извините за мой поздний ответ. Я нашел ссылку на ссылку сборки самого проекта clr-пространство имен:решение.Проект;сборка=проект поэтому я попробовал использовать его таким образом DataType="{x:Type myns:TargetNs.TargetClass}" но он говорит, что вложенные типы не поддерживаются для этого атрибута, поэтому я попытался использовать его как автономный ресурс, т. е. <myns:TargetNs.TargetClass x:Key="foo"></myns:TargetNs.TargetClass > тем не менее, он говорит, что имя TargetNs не существует в этом пространстве имен :'(

Dirk Bahle

Извините, но мне нужен более полный пример кода XAML, чем то, что вы показываете. Я не могу сказать, что вы пытаетесь сделать и как это исправить, основываясь только на фрагментах XML - пожалуйста, перечислите более полный список XAML.

Проблема несуществующей ссылки может быть вызвана целым рядом вещей-она начинается с мужской сформированной ссылки и заканчивается внутренним определением класса любые многие другие проблемы между ними - вам нужно перечислить больше кода (полный проект/решение было бы лучше всего), чтобы ожидать помощи в этом вопросе, я боюсь...

nmeri17

"заканчивается внутренним определением класса", да, я только что понял, что классы не были помечены как публичные (таким образом, внутренние). Установка их уровня доступа на публичный решила эту проблему, спасибо!

nmeri17

Как загрузить решение в виде zip-файла? Я спрашиваю, потому что это композитное решение mvvm, поэтому есть несколько файлов, я не знаю, какие из них будут иметь отношение к вам. Вот почему я воздержался от публикации какого-либо кода. Единственное различие между видимой сборкой/пространством имен и "несуществующей"/недоступной состоит в том, что видимое пространство имен содержит пользовательский элемент управления. Их определения одинаковы

nmeri17

Я только что обнаружил, что App.xaml имеет это сказать о файле ресурсов "произошла ошибка при поиске словаря ресурсов StringResx.xaml", хотя они оба находятся в одном и том же месте. Может ли это быть причиной?

nmeri17

Просто кажется, что имя ресурса жестко закодировано в какой-то конфигурационный файл, и этот файл не имеет доступа к файлу ресурсов. Я склонен так думать, потому что, даже если я изменю имя файла на "xxx", всплывающая подсказка об ошибке все равно сообщит о своей неспособности найти StringResx.xaml. Единственное упоминание этого имени, которое я могу найти, находится в файле .csproj. Когда я исключаю или скрываю его, обозреватель решений опускает его, но начинает сообщать об ошибках также и для того, что я использовал в качестве его замены.

Dirk Bahle

Ну, вы можете разместить код для App.xaml, словарь ресурсов и usercontrol непосредственно в посте (используя предварительный тег) или использовать DropBox, OneDrive или любой другой доступный oline - ресурс (лучше всего позже, так как я действительно могу загрузить проект в VS и посмотреть на него - обычно вы можете сократить количество файлов, сосредоточившись на тех, которые имеют отношение к проблеме-я часто сам находил решение, когда собирался опубликовать вопрос. Просто посмотрите на некоторые другие записи, и вы увидите, что делают другие ...

nmeri17

видишь ли https://drive.google.com/drive/folders/1hQ4Cer1b6LCIFunY3lRwwwen1XLeAmGl?usp=sharing

Рейтинг:
0

Dirk Bahle

Я рад, что вы сделали свой код загружаемым - он содержит множество проблем, которые вам нужно исправить, чтобы скомпилировать его:

Замените следующий XAML в StringRes.xaml

xmlns:topicsmd="clr-namespace:SchoolPrism.Topics.Model"
xmlns:topicsvm="clr-namespace:SchoolPrism.Topics.ViewModel">


с

xmlns:topicsmd="clr-namespace:SchoolPrism.Topics.Model;assembly=Topics"
xmlns:topicsvm="clr-namespace:SchoolPrism.Topics.ViewModel;assembly=Topics">


Это на самом деле то, что я пытался предложить в решении 1, не видя вашего кода...

Сделать уроки
TopicsViewModel
и
TopicSchema
публичные, поскольку в противном случае они будут невидимы вне своего собрания.

Я могу скомпилировать и запустить ваш код, когда внесу эти изменения. Но потом я получаю несвязанное исключение PRISM:
$exception	{"Directory ../../SchoolPrismInfrastructure/Modules was not found."}	System.InvalidOperationException
что я и исправил ниже для вас.

Основываясь на вопросах, которые вы задали, и простоте проблем, которые вы, кажется, не можете распознать и исправить, я рекомендую вам сначала построить свой проект без PRISM - а затем ввести PRISM, когда у вас есть рабочее приложение, - иначе вы будете пытаться жонглировать более чем одной совершенно новой темой одновременно, и некоторые шары разобьются о землю (я боюсь)...

Но я надеюсь, что это было полезно...

public class TopicSchema
    {
        public string Name {
            get; set;
        }

        public int Week
        {
            get; set;
        }

        public Uri VidLink { get; set; }

        public List<string> Instructions
        {
            get; set;
        }

        public string Code
        {
            get; set;
        }
        public string VidString
        {
            get { return VidString; }
            set {
                VidLink = new Uri("../../Topics/View/Assets/" + value, UriKind.Relative); // relative paths read from debug folder
            }
        }
    }


public class TopicsViewModel
    {
        public TopicSchema currentTopic
        {
            get; set;
        }

        public ObservableCollection<TopicSchema> getAllWeeks
        {
            get { return TopicsModel.GetAllWeeks(); }

            set { }
        }

        public DelegateCommand<string> displayTopic
        {
            get { return new DelegateCommand<string>(DisplayTopic); }

            set { }
        }

        public void DisplayTopic (string week) {

            var query = from topic in getAllWeeks where topic.Week== int.Parse(week) select topic;

            currentTopic = query.First();

            IModule allModules = ServiceLocator.Current.GetInstance<ModuleCatalog>().Modules.Where((ModuleInfo m) => m.ModuleName.Equals("TopicsModule")).Cast<IModule>().First(); //.ShowSandbox();
        }
    }


Я еще немного поиграл с ним и нашел простое решение для дополнительного исключения. Зайдите в Exporer раствора и:

1) добавьте папку модулей в
SchoolPrism
проект и
2) Добавить a ReadMe.txt файл в папку модули
3) щелкните правой кнопкой мыши на ReadMe.txt файл и выберите Свойства - выберите действие сборки=содержимое и скопируйте в OutputDirectory = всегда

Войти в
BootStrapper.cs
класс и отредактируйте следующие строки:
protected override IModuleCatalog CreateModuleCatalog ( ) {

            return new DirectoryModuleCatalog() {
                ModulePath = @".\Modules\" // executing path is debug/bin
            };
        }


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


nmeri17

Привет, Дирк. Как один аккаунт может разместить два решения на один вопрос? Я уже принял предыдущий ответ и снял его вчера. В комментариях я поблагодарил Вас за такую помощь. Разве ты не видел?

Dirk Bahle

Я думаю, что можно разместить столько решений, сколько можно - я видел первое решение, - но неужели вы действительно думаете, что эта многословная поддержка стоит только трех звезд? Во всяком случае, это не имеет значения - я надеюсь, что вы получите, чтобы реализовать что-то классное прямо сейчас :-)

nmeri17

Ну, 3+3 складывается в 6, что больше, чем оговоренная сумма для одного решения. Кроме того, я исправил это из подсказки в вашей гипотезе, так что я, вероятно, заслуживаю поделиться 2 из доступных 10 пунктов. Видишь? Справедливое распределение.

Итак, для бизнеса модули изначально были в основном проекте, но я переместил их в центральное место, чтобы они были доступны друг другу, не опасаясь циклической зависимости. Я намерен вызвать метод в сборке инфраструктуры, который установит путь к каталогу для каталога. Но этот вызов будет сделан из CreateModuleCatalog в загрузчике. Когда это не сработало, я закомментировал метод в целом, и приложение все еще компилировалось нормально. Я создал еще один вопрос по этому поводу, который подводит меня к вашему предложению

<quote>рекомендую вам сначала построить свой проект без призмы </quote>
Поскольку я все равно собираюсь использовать отраслевой стандарт для внедрения mvvm, зачем откладывать работу с ним?