我们正在为后台办公产品开发一个相当复杂的Silverlight 3 RIA用户界面。这部分功能的一部分是用户可以选择主题。我们正在使用Telerik主题,这些要求我们在App_Init时应用主题选择。
所以我们当然可以为主题选择一个UI,但是我们需要重新启动应用程序以应用主题。
显然,在浏览器中,这很容易 - 我们只需要转到HtmlPage并注入一些JavaScript。
但是浏览器应用程序呢?对此的另一个要求是,一旦OOB检测到并下载了应用程序的更新版本。
(已经搜索过这个,似乎没有人解决这一点)
更新1(感谢Valeri)
我们已经应用了Valeri的代码,但是遇到了问题。我们认为主题可能只能设置一次。我们有:
在我们的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的新手,很高兴接受教育。 :)
两种方法都很棒。
答案 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也可能包含错误,因此如果您将主题发送给我们将会非常有用。