2010-02-12 135 views
4

我們正在爲後臺產品製作相當複雜的Silverlight 3 RIA用戶界面。這部分功能是用戶可以選擇主題。我們使用Telerik主題,這些要求我們在App_Init時應用主題選擇。Silverlight 3退出瀏覽器 - 重新啓動「應用程序」

所以我們當然可以選擇主題的UI,但是我們需要重新啓動應用程序來應用主題。

顯然,在瀏覽器中,這很容易 - 我們只需拖放到HtmlPage並注入一些JavaScript。

但是,瀏覽器外的應用程序呢?另一個要求是OOB檢測並下載了應用程序的更新版本。

(已搜索周圍這一點,沒有人似乎解決了這一點)

更新1(感謝瓦萊裏)

我們應用瓦列裏的代碼,但越來越問題。我們認爲這個主題可能只能一次設定。我們有:

  • 移動的XAML出到一個新的用戶控件(LayoutMockup)
  • 將RootVisual到網格和App_Init

加通首頁網格在我們的MainPage,我們有(1類是我們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()); 
    } 

這是第一次運行,它的工作原理。 「Spring/Class1」主題已正確應用。 第二次(通過一個模擬按鈕在UI上發起)的ChangeTheme()方法被調用與已知的工作主題,我們得到一個異常:

System.Exception的是由用戶 代碼信息未處理=」 錯誤HRESULT E_FAIL 已經從呼叫返回到COM 部件「堆棧跟蹤: 在MS.Internal.XcpImports.CheckHResult(UInt32的 小時) 在MS.Internal.XcpImports.SetValue(INativeCoreTypeWrapper OBJ,的DependencyProperty物業, 字符串s) ...... etc ......

我們走了重新啓動應用程序的路線,而不是切換主題,因爲我們在某處讀過這是不可能的。但我們是Silverlight的新手,很高興能夠接受教育。 :)

兩種方法都會很好。

+0

我發現這個問題很有趣,不僅是爲了重新設置佈局,還要在更新後重新啓動或在發生致命的崩潰後恢復。這種類型的硬重啓有可能嗎? – 2010-02-12 20:45:37

+0

@Lars:我不這麼認爲。沒有人提出這個建議,我在某處讀到你需要讓用戶重啓應用程序。我想這可能是由於安全性,但它確實表現出糟糕的用戶體驗。 – 2010-02-13 10:52:49

回答

3

除了在RootVisual控件(通常是MainPage.xaml)中添加應用程序UI之外,您可以將其添加到單獨的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是包含應用程序代碼和包含的MainPage僅一個網格,其中x的用戶控件:名稱= LayoutRoot。當主題必須改變時,你只需要調用ChangeTheme方法。

我希望這會有所幫助。

+0

非常感謝Valeri。我們還沒有取得任何成功。請參閱上面更新的帖子。我想我從Telerik認出你。我們正在使用您的控件的內部版本2009.3.1405。 – 2010-02-12 13:14:41

0

如果您最初設置了第二個主題,第二個主題是否可以工作?

不幸的是,我不能說只有通過查看堆棧跟蹤才能確定問題,SL堆棧跟蹤有時不提供有用的信息。我建議在telerik.com上打開一個新的支持票證或論壇帖子,以便我可以向您發送一份工作示例。您的XAML也可能包含錯誤,所以如果您向我們發送您的主題,它會有很大的幫助。

+0

Ok Valeri,會做。 – 2010-02-13 10:51:10

+0

嗨Valeri,不需要支持票。可能在睡眠之後,我想到了由於我加載了一個尚未預先加載的主題而發生的錯誤。我應該加載Office_Black主題,而不是Office_Blue。 – 2010-02-16 09:29:16

相關問題