Попытка понять детали назначения ресурса приложения

У меня есть ComboBox с ItemsSource = "{DynamicResource testResource}". TestResource - это ресурс приложения, который я установил в коде C #.

Я заметил, что если я загружаю Window перед созданным приложением, ресурс не загружается ComboBox:

Window window = (Window)LoadXaml("Window1.xaml");
Application app = new Application();

Этот код работает

Application app = new Application();
Window window = (Window)LoadXaml("Window1.xaml");

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

Кто-нибудь может объяснить, что происходит? Почему порядок важен?

Window1.xaml:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <ComboBox ItemsSource="{DynamicResource testResource}" SelectedIndex="0"></ComboBox>
        <Button x:Name='testButton'>Test</Button>
    </StackPanel>
</Window>

C#

class Program
{
    [STAThread]
    public static void Main()
    {
        Window window = (Window)LoadXaml("Window1.xaml");
        Application app = new Application();
        SetupResource();

        (window.FindName("testButton") as Button).Click += new RoutedEventHandler(testButton_Click);
        window.Show();
        app.Run(window);
    }

    static void testButton_Click(object sender, RoutedEventArgs e)
    {
        SetupResource();
    }

    static void SetupResource()
    {
        List<string> list = new List<string>();
        list.Add("Hola");
        list.Add("Mundo");
        Application.Current.Resources["testResource"] = list;
    }

    static object LoadXaml(string fileName)
    {
        return XamlReader.Load(File.Open(fileName, FileMode.Open));
    }
}

person alex2k8    schedule 31.03.2009    source источник


Ответы (1)


Не уверен, но я предполагаю, потому что ресурсы Application загружаются только при создании объекта Application. Поэтому, если вы хотите получить доступ к testResource, вам нужно сделать это после вызова new Application().

person Anthony Brien    schedule 30.04.2009