如何在初始化用户控件之前设置皮肤名称?

时间:2015-05-22 10:00:15

标签: c# wpf

我有一个带有单选按钮的主窗口和一个打开下一个窗口的按钮。下一个窗口具有大的用户控件,由许多相同的较小用户控件组成。现在,当选择了一个单选按钮时,它会将其名称发送到小用户控件,在那里它被用作每个皮肤的库名称。 (皮肤只是改变小用户控件的外观。)

现在我遇到的问题是,只有在初始化之后,库的名称才会到达小用户控件,这已经太晚了,因为那时字符串名称的值已经被认为是null并且没有加载外观。

这是来自小型用户控件的代码:

  public string name ="";
    public bool SetSkin(string _Banananas)
    {
        name = _Banananas;

        return true;
    }
    public SW1()
    {       
        InitializeComponent();
        Loaded += OnSkinChanged;
        DataContext = this;
        IsBlinking = false;

    }


    private void OnSkinChanged(object sender, RoutedEventArgs e)
    {

        mg.Resources.Clear();
          mg.Resources.MergedDictionaries.Clear();

        ResourceDictionary skin = Application.LoadComponent(new Uri("/TestingApp;component/Resources/Skins/" + name + ".xaml", UriKind.Relative)) as ResourceDictionary;
        mg.Resources.MergedDictionaries.Add(skin);

        e.Handled = true;
    }

_Banananas是我从单选按钮获得的字符串。

所有想法?

1 个答案:

答案 0 :(得分:1)

我不完全确定你在@Html.Partial("EmployeeDisplayControl", (object)ViewBag.ITDept[i]) 方法中使用的mg对象是什么,但我认为你在这里使用OnSkinChanged对象。

您遇到的问题是,在WPF中,在初始化用户界面对象之后以及在新创建的窗口或用户控件上调用任何方法之前,会引发加载的事件。

解决此问题的一种“脏”方法是创建另一个接收皮肤值作为参数的构造函数,如下所示:

App

当然,您必须在创建此用户控件的代码部分调用此构造函数(而不是默认构造函数)。

但是,有些模式如何在WPF中使用动态主题,而您的代码似乎并不遵循它们。只需谷歌搜索或查看Stack Overflow上的其他问题,例如:https://stackoverflow.com/a/11151024/1560623