Mahapps.Metro更改单个控件的主题

6
有没有办法在Mahapps Metro中按控件更改主题(浅色/深色)? 我的问题是,我有一个使用浅色主题的窗口,但其中一部分具有非常深的背景,我无法使ComboBox正确显示,即使我将背景颜色更改为黑色并将前景更改为白色,小箭头仍然保持黑色。 我发现了一些关于通过控制模板围绕某些相当严重的诡计来更改该箭头的参考资料,但到目前为止没有太多运气... 为了使事情变得更加复杂,ComboBox位于ListBox的ItemTemplate中。 我在其他地方有一个flyout,我意识到它具有完全适合ComboBoxes的样式,因为它使用了深色主题。这就是为什么我问是否有一种简单的方法可以在单个控件下切换主题的原因?
谢谢!
1个回答

7

我不确定我是否正确理解了这个问题。您想在父控件使用浅色主题时使ComboBox使用暗色主题吗?

如果是这样,那么很简单。在控件的资源作用域内添加“DarkTheme”资源。

所以假设我们有:

 <Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      ...
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

现在您的应用程序中的几乎所有内容都使用了浅色主题。但是,如果我们定义了一个 ComboBox,例如:

<ListBox>
  <!-- This is just for an example so you would ofc have this defined in the ItemTemplate normally -->
  <ListBoxItem>
    <ComboBox>
      <ComboBox.Resources>
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseDark.xaml" />
      </ComboBox.Resources>
      <ComboBoxItem Content="A" />
      <ComboBoxItem Content="A" />
      <ComboBoxItem Content="A" />
    </ComboBox>
  </ListBoxItem>
  <ListBoxItem Content="A" />
  <ListBoxItem Content="A" />
</ListBox>

现在我们将BaseDark.xaml资源添加到ComboBox的范围中,这样它就可以应用到暗色主题。
这种方法的原因在于有一些Brush的魔法:控件都是使用查询和查找的Brush进行样式设置的。当多个Brushes具有相同名称时,具有最高范围优先级的资源优先。

因此,实质上BaseLight.xamlBaseDark.xaml都定义了具有不同颜色的相同Brushes。

根据应用于控件的资源,决定了该控件或其子元素使用哪个主题。

谢谢!您的解决方案非常简单并且有效!不过,我一直在VS2012中收到以下错误消息:无法将类型为“System.Windows.ResourceDictionary”的对象强制转换为类型“Microsoft.Expression.Markup.DocumentModel.DocumentCompositeNode”。我认为这是Vs的xaml解析器的问题,因为程序本身没有问题,而且我也一直在使用与mahapps演示相同的metro对话框却仍然会收到对象引用为空的错误(但实际上它是可以正常工作的…)。 - Exhodus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接