2015-05-22 7 views
1

У меня есть Главное окно с кнопками и кнопкой, открывающей следующее окно. В следующем окне есть большие пользовательские элементы управления, которые состоят из множества идентичных меньших пользовательских элементов управления. Теперь, когда выбрана радиокнопка, она отправляет свое имя в маленькие пользовательские элементы управления, где оно используется как имя библиотеки для каждого скина. (Шкуры меняют только параметры небольших пользовательских элементов управления.)Как установить имя скина перед инициализацией пользовательского элемента управления?

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

Это код из небольшого пользовательского элемента управления:

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

Я не совсем уверен, что такое объект mg, который вы используете в своем методе OnSkinChanged, но я предполагаю, что вы используете здесь объект App.

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

Один «грязный» способ решения этой проблемы является создание другого конструктора, который принимает значение кожи в качестве параметра, например так:

public SW1(string skin) 
{ 
    InitializeComponent(); 
    SetSkin(skin); 
    Loaded += OnSkinChanged; 
    DataContext = this; 
    IsBlinking = false; 
} 

Конечно, вы должны вызвать этот конструктор (не по умолчанию) в разделе кода, который создает этот пользовательский элемент управления.

Однако существуют шаблоны использования динамических тем в WPF, и ваш код, похоже, не следует за ними. Просто просмотрите его или просмотрите другие вопросы о переполнении стека, например: https://stackoverflow.com/a/11151024/1560623

+0

Спасибо за респоз, объект mg - это сетка в SW1, а SW1 - это небольшой пользовательский элемент управления, поэтому это не будет работать (Я попробовал), я попытался сделать это по-разному, но пока не нашел ничего полезного, я проверил вашу ссылку и теперь перебираю ее дальше, но дело в том, что я не использую mvvm, и это я думаю, слишком много сейчас, чтобы превратиться в него. Я нашел несколько страниц по динамическому скинированию, но ни один из них не имел бы аналогичных вложенных элементов управления. – Evil

+0

Используете ли вы 'DynamicResource' в файлах XAML своих элементов управления пользователя? Если да, то вы можете динамически менять стили во время выполнения - я бы даже посоветовал вам сделать это на уровне приложения. Для достижения этой функциональности вам не обязательно следовать шаблону MVVM. – feO2x

+0

Я использую динамический ресурс. И я бы сменил скины раньше на более высоком уровне, но все дело в том, что когда нажата кнопка открытия, окна inits и BW1 (большой пользовательский контроль) умножаются в соответствии с данными, заполненными SW1 соответственно, и все это происходит при одной инициализации после другого мгновенно. Поэтому я думаю, что мне нужен способ обновить SW1 или что-то сразу после того, как строка имени изменит его значение ... – Evil

Смежные вопросы

 Смежные вопросы