UWP - 动态加载不同的Styles.xaml

时间:2017-04-06 09:43:36

标签: uwp

是否可以在运行时根据特定条件动态加载不同样式的ResourceDictionary?

我希望我的应用程序只有一个版本,但根据具体设置有不同的颜色/品牌。 假设以上是不可能的,我最好能做到这一点吗?

1 个答案:

答案 0 :(得分:1)

在我记忆中,不能在运行时动态设置ResourceDictionary - 而不是在UWP上。恕我直言,唯一的方法是改变ColorBrushes或整个风格。

第一个选项:如果需要动态更改颜色,则需要在ResourceDictionary中创建Brush

<SolidColorBrush x:Key="MyBrush">#333344</SolidColorBrush>

并将其与样式/ xaml布局等一起使用。

要更改它,您需要(假设您只有一个资源配置集或首先包含颜色画笔的那个)从字典中取出画笔并替换它的颜色。

if (Application.Current.Resources.MergedDictionaries[0].ContainsKey("MyBrush"))
{
    var brush = Application.Current.Resources.MergedDictionaries[0]["MyBrush"] as SolidColorBrush;
    if (brush != null)
    {
        brush.Color = return new Color() { A = 255, R = r, G = g, B = b };
    }
}

第二个选项:如果需要在运行时更改整个样式(假设您在资源字典中设置了MyStyle和MyOtherStyle,并希望将其应用于名为MyControl的某个控件):

 switch(anyValue)
 {
     case 1:
          var myStyle = Application.Current.Resources["MyStyle"] as Style;
          if(myStyle != null)
          {
              MyControl.Style = myStyle;                 
          }
          break;
     case 2:
          var myOtherStyle = Application.Current.Resources["MyOtherStyle"] as Style;
          if(myOtherStyle != null)
          {
              MyControl.Style = myOtherStyle;                  
          }
          break;
}

第三个选项:使用为控件设置的VisualStates更改样式。它需要为您想要更改的控件编写自己的VisualStates,然后手动切换它们。没试过,所以我不知道这种方式有多可靠。对于性能而言,它看起来是最佳方式(仅限假设),但是为每个控件手动保留VisualStates可能需要实现自己的VisualStateManager,并且可能会在您需要时保持正确的VisualState时出现问题。