2010-02-12 140 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

相关问题