2010-02-12 3 views
4

Мы работаем над довольно сложным интерфейсом Silverlight 3 RIA для нашего бэк-офисного продукта. Часть функциональности этого заключается в том, что пользователь может выбирать темы. Мы используем темы Telerik, и нам требуется применить выбор темы во время App_Init.Silverlight 3 из браузера - перезагрузка «приложение»

Таким образом, у нас наверняка есть пользовательский интерфейс выбора для тем, но затем нам нужно перезапустить приложение для применения тем.

Очевидно, что в браузере это будет легко - мы просто перейдем к HtmlPage и добавим JavaScript.

Но как насчет приложения с браузером? Другим требованием для этого является то, что OOB обнаружил и загрузил обновленную версию приложения.

(искал вокруг этого, и никто не кажется, решить эту точку)

UPDATE 1 (Спасибо Валерии)

мы применили код Valeri, но получают проблемы. Мы считаем, что тема может быть установлена ​​только однажды. Мы имеем:

  • покрутил XAML из в новый UserControl (LayoutMockup)
  • Установите RootVisual к сетке и добавил MainPage к сетке в App_Init

На нашем MainPage, мы имеем (Class1 наш imaginitively названием темы):

public MainPage() 
    { 
     InitializeComponent(); 
     this.InitializeUI(); 
     Class1 customTheme = new Class1(); 
     customTheme.Source = new Uri("/Migturbo_Spring;Component/Themes/MyGeneric.xaml", UriKind.Relative); 
     ChangeTheme(customTheme); 


    } 

, а также дополнительно код:

public void ChangeTheme(Theme theme) 
    { 
     StyleManager.ApplicationTheme = theme; // FAILS HERE 2ND TIME 
     this.LayoutRoot.Children.Clear(); 
     this.InitializeUI(); 
    } 


    private void InitializeUI() 
    { 
     this.LayoutRoot.Children.Add(new LayoutMockup()); 
    } 

При первом запуске он работает. Тема «Весна/Класс1» правильно применяется. Второй раза (инициируемый с помощью кнопки макета на UI) метод ChangeTheme() вызываются с известной рабочей темой, мы получаем исключение:

System.Exception был необработанным от пользователя кода Message =» Ошибка HRESULT E_FAIL был возвращен из вызова к "StackTrace COM- компонент:. в MS.Internal.XcpImports.CheckHResult (UInt32 ч) на MS.Internal.XcpImports.SetValue (INativeCoreTypeWrapper OBJ, DependencyProperty имущество, String s) ...... и т. д.

Мы пошли по пути перезапуска приложения, в отличие от переключения тем, потому что мы где-то читали, что это было невозможно. Но мы не знакомы с Silverlight и рады быть образованными. :)

Любой подход был бы замечательным.

+0

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

+0

@Lars: Я не думаю, что это так. Никто не предложил его, и я где-то читал, что вам нужно попросить пользователя перезапустить приложение. Я предполагаю, что это может быть связано с безопасностью, но это плохой UX. –

ответ

3

Вместо добавления пользовательского интерфейса приложения в элемент управления RootVisual (обычно MainPage.xaml) вы можете добавить его в отдельный UserControl, который будет создан внутри кода MainPage. Когда вы меняете тему, вам просто нужно создать новый экземпляр этого UserControl и заменить старый.Например:

public class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     this.InitializeUI(); 
    } 

    public void ChangeTheme(Theme theme) 
    { 
     StyleManager.ApplicationTheme = theme; 
     this.LayoutRoot.Children.Clear(); 
     this.InitializeUI(); 
    } 

    private void InitializeUI() 
    { 
     this.LayoutRoot.Children.Add(new UIRoot()); 
    } 
} 

Где UIRoot является UserControl, который содержит код приложения и содержит только MainPage сетки, с й: Name = LayoutRoot. Когда нужно изменить тему, вам нужно только вызвать метод ChangeTheme.

Надеюсь, это поможет.

+0

Большое спасибо, Валери. Мы не добились успеха в этом. Пожалуйста, ознакомьтесь с обновленным сообщением выше. Кажется, я узнал тебя от Телерика. Для этого мы используем вашу внутреннюю сборку вашего 2009.3.1405. –

0

Работает ли вторая тема, если вы ее первоначально задали?

К сожалению, я не могу сказать, в чем проблема, только глядя на трассировку стека, вы знаете, что трассировки стека SL иногда не предоставляют полезной информации. Я бы предложил открыть новый билет поддержки или сообщение в форуме на telerik.com, чтобы я мог отправить вам рабочий образец. Также возможно, что ваш XAML содержит ошибки, поэтому было бы очень полезно, если вы отправите нам свои темы.

+0

Ok Valeri, сделаю. –

+0

Привет, Валери, вам не нужен билет поддержки. Вероятно, после сна, я понял, что ошибка произошла из-за моей загрузки темы, которая еще не была предварительно загружена. Я должен был загрузить тему Office_Black, а не Office_Blue. –