Попытка понять детали назначения Ресурса Приложения - PullRequest
1 голос
/ 01 апреля 2009

У меня есть 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));
    }
}

1 Ответ

0 голосов
/ 30 апреля 2009

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

...