代码之家  ›  专栏  ›  技术社区  ›  Program.X

Silverlight 3脱离浏览器-重新启动“应用程序”

  •  4
  • Program.X  · 技术社区  · 16 年前

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

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

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

    (我们到处寻找这个问题,似乎没有人提出这一点)

    更新1(感谢Valeri)

    • 将XAML移出到新的UserControl(LayoutMockup)中

    在我们的主页上,我们有(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”主题。

    系统。用户未处理异常 代码消息=“ 错误HRESULT E\ U FAIL 已从对COM的调用中返回 “堆栈跟踪: 在MS.Internal.XcpImports.CheckHResult(UInt32 在MS.Internal.XcpImports.SetValue(INativeCoreTypeWrapper)处 对象,DependencyProperty属性, 字符串(s) ...... 等。。。。。。

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

    两种方法都很好。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Valeri Hristov    16 年前

    不必在RootVisual控件(通常是MainPage.xaml)中添加应用程序UI,您可以将其添加到单独的UserControl中,该控件将在MainPages代码中实例化。当您更改主题时,您只需要创建此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());
        }
    }
    

    我希望这有帮助。

        2
  •  0
  •   Valeri Hristov    16 年前

    如果你一开始就设置了第二个主题,它能工作吗?