Silverlight 3脱离浏览器-重新启动“;申请书;

Silverlight 3脱离浏览器-重新启动“;申请书;,silverlight,out-of-browser,Silverlight,Out Of Browser,我们正在为我们的后台产品开发一个相当复杂的Silverlight 3 RIA UI。部分功能是用户可以选择主题。我们正在使用Telerik主题,这要求我们在应用程序初始化时应用主题选择 因此,我们当然可以为主题创建一个选择UI,但是我们需要重新启动应用程序来应用主题 显然,在浏览器中,这很容易——我们只需切换到HtmlPage并注入一些JavaScript 但是浏览器外应用程序呢?另一个要求是一旦OOB检测到并下载了应用程序的更新版本 (我们四处寻找,但似乎没有人提出这一点) 更新1(谢谢Val

我们正在为我们的后台产品开发一个相当复杂的Silverlight 3 RIA UI。部分功能是用户可以选择主题。我们正在使用Telerik主题,这要求我们在应用程序初始化时应用主题选择

因此,我们当然可以为主题创建一个选择UI,但是我们需要重新启动应用程序来应用主题

显然,在浏览器中,这很容易——我们只需切换到HtmlPage并注入一些JavaScript

但是浏览器外应用程序呢?另一个要求是一旦OOB检测到并下载了应用程序的更新版本

(我们四处寻找,但似乎没有人提出这一点)

更新1(谢谢Valeri)

我们已经应用了Valeri的代码,但是遇到了问题。我们认为这个主题可能只能设定一次。我们有:

  • 将XAML移出到新的UserControl(LayoutMockup)中
  • 将RootVisual设置为网格,并在App_Init中将主页添加到网格中
在我们的主页上,我们有(Class1是我们想象中的主题):

以及进一步的守则:

    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()方法时,我们得到一个异常:

用户未处理系统异常 代码消息=“错误HRESULT E_失败 已从对COM的调用返回 组件。“堆栈跟踪: 在MS.Internal.XcpImports.CheckHResult(UInt32)处 人力资源部) 在MS.Internal.XcpImports.SetValue处(INativeCoreTypeWrapper obj,从属财产财产, 字符串(s) ...... 等等

我们选择重新启动应用程序,而不是切换主题,因为我们在某个地方读到这是不可能的。但我们对Silverlight还是新手,很高兴接受教育


这两种方法都很好。

您可以将应用程序UI添加到单独的UserControl中,而不是在RootVisual控件(通常是MainPage.xaml)中添加,该控件将在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只包含一个网格,x:Name=LayoutRoot。当必须更改主题时,只需调用ChangeTheme方法


我希望这会有所帮助。

如果您最初设置了第二个主题,它会起作用吗


不幸的是,我不能仅仅通过查看堆栈跟踪来说明确切的问题是什么,你知道,SL堆栈跟踪有时不能提供有用的信息。我建议在telerik.com上打开一个新的支持标签或论坛帖子,这样我就可以向您发送一个工作样本。您的XAML也可能包含bug,因此如果您将主题发送给我们,将非常有帮助。

非常感谢,Valeri。我们在这方面没有取得任何成功。请参阅上面更新的帖子。我想我从Telerik认出了你。我们正在使用您的控件的2009.3.1405内部版本进行此操作。我发现这个问题很有趣,不仅是为了重置布局,而且是为了在更新后重新启动或在致命崩溃后恢复。这种硬重启可能吗?@Lars:我认为不可能。没有人建议,我在某个地方读到,你需要要求用户重新启动应用程序。我想这可能是由于安全原因,但它确实提供了一个糟糕的用户体验。嗨,瓦莱里,不需要支持票。可能是在一次睡眠之后,我发现这个错误是因为我加载了一个尚未预加载的主题。我应该加载Office_黑色主题,而不是Office_蓝色。
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());
    }
}