1

我有一个 ItemsSource="{DynamicResource testResource}" 的组合框。testResource 是我在 C# 代码中设置的 Application 资源。

我注意到的是,如果我在创建应用程序之前加载 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));
    }
}
4

1 回答 1

0

不确定,但我猜是因为Application's Resources 仅在Application创建对象时加载。所以如果你想访问testResource,你需要在调用后进行new Application()

于 2009-04-30T17:37:35.930 回答