Silverlight 3浏览器外 - 重启“应用程序”

时间:2010-02-12 11:17:03

标签: silverlight out-of-browser

我们正在为后台办公产品开发一个相当复杂的Silverlight 3 RIA用户界面。这部分功能的一部分是用户可以选择主题。我们正在使用Telerik主题,这些要求我们在App_Init时应用主题选择。

所以我们当然可以为主题选择一个UI,但是我们需要重新启动应用程序以应用主题。

显然,在浏览器中,这很容易 - 我们只需要转到HtmlPage并注入一些JavaScript。

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

(已经搜索过这个,似乎没有人解决这一点)

更新1(感谢Valeri)

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

  • 将XAML移出到新的UserControl(LayoutMockup)
  • 将RootVisual设置为网格,并将MainPage添加到App_Init中的网格

在我们的MainPage上,我们有(Class1是我们想象中的标题主题):

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未被用户处理   代码Message =“错误HRESULT E_FAIL   已从COM调用返回   组件。“StackTrace:          在MS.Internal.XcpImports.CheckHResult(UInt32   小时)          在MS.Internal.XcpImports.SetValue(INativeCoreTypeWrapper   obj,DependencyProperty属性,   字符串s)   ......等等......

我们采用了重新启动应用程序的路径而不是切换主题,因为我们已经阅读过某些不可能的地方。但我们是Silverlight的新手,很高兴接受教育。 :)

两种方法都很棒。

2 个答案:

答案 0 :(得分:3)

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

我希望这会有所帮助。

答案 1 :(得分:0)

如果您最初设置它,第二个主题是否有效?

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