【发布时间】: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