Невозможно получить доступ к ресурсу, определенному в app.xaml - PullRequest
11 голосов
/ 21 марта 2010

Я использую Visual Studio 2010 RC1.

Я определяю ресурс "Brush2" в app.xaml _:

<Application x:Class="VideoThumbnails.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>

        <RadialGradientBrush x:Key="Brush2" RadiusX="1" RadiusY="1" GradientOrigin="0.3,0.3">
            <GradientStop Color="White" Offset="0"/>
            <GradientStop Color="#ffc0c0" Offset="1"/>
        </RadialGradientBrush>

    </Application.Resources>
</Application>

В моем главном окне я пытаюсь использовать этот ресурс:

...
<Border Margin="4,2" BorderBrush="Black" BorderThickness="2" CornerRadius="4"
        ToolTip="{Binding Path=FullPath}" HorizontalAlignment="Stretch"
        Background="{StaticResource Brush2}">
...

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

Как я могу использовать ресурсы, определенные в app.xaml?

Ответы [ 5 ]

19 голосов
/ 09 февраля 2011

Если вы установили объект запуска для пользовательского класса, вам нужно создать пользовательский класс Application, а также вызвать его метод InitializeComponent, например:

App app = new App();
app.InitializeComponent();

Обновление: как @ qqww2 предположил, что вызов InitializeComponent можно переместить в конструктор класса App.

5 голосов
/ 21 марта 2010

Ничего из того, что вы сделали, неверно. Вы либо: 1) каким-то образом испортили сборку проекта, в то же время случайно выполняя какие-то действия, чтобы попытаться заставить его работать, либо 2) что-то еще происходит здесь, и мы никогда не узнаем без подробностей исключения.

Я настоятельно рекомендую вам повторить это в новом совершенно новом проекте WPF. Выполните следующие шаги (и ТОЛЬКО следующие шаги):

Создайте новый проект WPF, добавьте точно такую ​​же кисть в app.xaml, затем откройте Window1 и привяжите фон окна к ресурсу. Запустите приложение.

Должно работать как положено. Если нет, вернитесь с деталями исключения. Если это так, сравните этот новый проект с текущим, чтобы увидеть, что вы делаете по-другому.

3 голосов
/ 15 апреля 2014

Я могу согласиться, что ресурсы легко испортятся, если у вас есть что-то в конструкторе приложений. Переместите инициализацию ваших собственных глобальных объектов в метод OnStartup:

protected override void OnStartup(StartupEventArgs e)
{
}
3 голосов
/ 15 февраля 2014

У меня была похожая проблема, и я решил ее, поэтому решил, что могу также опубликовать свое решение. Я продолжал получать ошибку Resource not found только во время выполнения, как описано выше. В моем приложении Windows 8.1 c # я использовал стиль, который я определил, и он хорошо отображался в Blend и в представлении конструктора, но не работал во время выполнения. Я пытался использовать этот стиль в настройках, которые я создал, следуя этим инструкциям . После того, как это сработает, я настроил поле в App.xaml для удержания моих всплывающих окон (Preferences и ColorSettings), чтобы я не делал новые каждый раз.

public static Preferences preferences;
public static ColorSettings colorsettings;

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;
    preferences = new Preferences();
    colorsettings = new ColorSettings();
}

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

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

3 голосов
/ 10 октября 2012

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

После некоторых первоначальных исследований я определил, что для свойства BuildAction для App.xaml должно быть установлено значение ApplicationDefinition. Мой был установлен на страницу. Однако это вызывает некоторые проблемы с несколькими точками входа. Main () уже был определен в App.xaml.cs. Ошибка компиляции указала на другую точку входа в App.g.cs (это автоматически сгенерированный файл).

В итоге я использовал подход № 3, описанный в http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_metho.html. Основная идея заключается в том, что вы создаете новый класс, который отвечает только за запуск. В моем случае я назвал его Startup.cs. Он должен иметь код, подобный следующему:

using System.Threading;

namespace MyNamespace
{
    public class Startup
    {
        [System.STAThreadAttribute()]
        private static void Main()
        {   
            var app = new App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

Затем в настройках проекта измените объект Application -> Startup, чтобы выбрать новый класс.

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