IOException при обращении к ResourceDictionary App.xaml - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь сослаться на ResourceDictionary App.xaml из отдельного окна WPF.Я хочу использовать ресурсы оттуда в разных окнах, и это похоже на рекомендуемый способ сделать это.К сожалению, я не могу эффективно ссылаться на App.xaml из другого окна.Вот мой App.xaml:

<Application x:Class="View.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
         xmlns:ViewModel="clr-namespace:ViewModel;assembly=ViewModel"
         xmlns:local="clr-namespace:View"
         StartupUri="ClockView.xaml">
<Application.Resources>
    <ResourceDictionary>
        <local:PriorityToIconConverter x:Key="PriorityToIconConverter" />
    </ResourceDictionary>
</Application.Resources>

Примечания: я не использую MainWindow, поэтому я заменил URI запуска на форму, которая всегда появляется.Я заметил, что в некоторых других ответах, местоположение MainWindow иногда является проблемой.В моем случае я не видел никакой разницы между использованием ClockView или MainWindow.ClockView и MainWindow существуют в корневом пространстве имен, MainWindow просто никогда не загружается.У меня также есть больше ресурсов, но я удалил их ради краткости.

Вот упрощенный пример кода, где я пытаюсь сослаться на ResrouceDictionary из App.xaml:

<local:AssistantWindow 
    x:Class="View.AutomatorView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    xmlns:properties="clr-namespace:View.Properties"
    xmlns:local="clr-namespace:View"
    mc:Ignorable="d"
    Title="Tool" 
    x:Name="Tool"
    Background="Transparent"
    Height="600"
    Width="450"
    Topmost="{Binding Source={x:Static properties:Settings.Default}, Path=ToolAlwaysOnTop}"
    MinHeight="515"
    MinWidth="150">

<Window.Resources>
    <ResourceDictionary Source="App.xaml" />
</Window.Resources>

Опять же, это упрощенно, чтобы быть кратким,Когда я пытаюсь загрузить эту форму, я получаю исключение:

System.Windows.Markup.XamlParseException: ''Set property 'System.Windows.ResourceDictionary.Source' threw an exception.' Line number '21' and line position '10'.'

Inner Exception
IOException: Cannot locate resource 'tool/app.xaml'.

Представление «Инструмент» находится в папке, которая также называется «Инструмент».Тем не менее, xaml и код позади не ссылаются на это пространство имен, я просто использую папку для организации своих классов.Похоже, что он ищет App.xaml в папке, в которой находится представление. App.xaml находится в корневом пространстве имен (View).Я попытался изменить источник в xaml для инструмента, чтобы: - View.App.xaml - Просмотр: App.xaml - Просмотр / App.xaml

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

1 Ответ

1 голос
/ 06 июня 2019

Вы не можете загрузить App.xaml так, как пытаетесь это сделать, потому что на самом деле это не ResourceDictionary. Вы можете указать только файлы ResourceDictionary в качестве цели Source.

Однако, если вы объявите ресурс в App.xaml, вы сможете ссылаться на него где угодно, не загружая файл, в котором он находится. Это делается автоматически. Поэтому вы можете в любое время ссылаться на свой конвертер с помощью {StaticResource PriorityToIconConverter}.

Обратите внимание, что если вы переместили его из исходного местоположения по умолчанию (папки базового проекта), вам может придется обновить его местоположение. Щелкните правой кнопкой мыши ваш проект, затем Свойства. Перейдите на вкладку «Приложение» (должен быть самый верхний элемент на левой боковой панели) и найдите поле «Объект запуска». Установите это на [ProjectName].[Namespace?].[Namespace?].App. Когда я тестировал его, мой работал без необходимости вручную менять местоположение, но ваши настройки могут отличаться.

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