【问题标题】:Silverlight 3 Out of Browser - Restart "application"Silverlight 3 退出浏览器 - 重新启动“应用程序”
【发布时间】:2011-01-16 02:53:10
【问题描述】:

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

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

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

但是 Out of browser 应用程序呢?另一个要求是一旦 OOB 检测到并下载了应用程序的更新版本。

(已经搜索了这个,似乎没有人解决这个问题)

更新 1(感谢 Valeri)

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

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

在我们的 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 的新手,很高兴接受教育。 :)

任何一种方法都很好。

【问题讨论】:

  • 我发现这个问题很有趣,不仅是为了重置布局,也是为了在更新后重新启动或在致命崩溃后恢复。这种硬重启可以吗?
  • @Lars:我不这么认为。没有人提出建议,我在某处读到您需要要求用户重新启动应用程序。我想这可能是出于安全考虑,但它确实呈现出糟糕的用户体验。

标签: silverlight out-of-browser


【解决方案1】:

您可以将其添加到单独的 UserControl 中,而不是将应用程序 UI 添加到 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 仅包含一个 Grid,x:Name=LayoutRoot。当需要更改主题时,您只需调用 ChangeTheme 方法即可。

我希望这会有所帮助。

【讨论】:

  • 非常感谢,瓦莱里。我们在这方面没有取得任何成功。请参阅上面的更新帖子。我想我从 Telerik 认出了你。为此,我们正在使用您的控件的 2009.3.1405 内部版本。
【解决方案2】:

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

不幸的是,我不能仅通过查看堆栈跟踪来说明确切的问题,您知道,SL 堆栈跟踪有时无法提供有用的信息。我建议在 Telerik.com 上打开新的支持票或论坛帖子,以便我可以向您发送工作样本。您的 XAML 也可能包含错误,因此如果您将主题发送给我们将会有很大帮助。

【讨论】:

  • 您好 Valeri,不需要支持票。可能是在睡觉之后,我发现错误是由于我加载了一个尚未预加载的主题而发生的。我应该加载 Office_Black 主题,而不是 Office_Blue。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多