Mahapps.Metro меняет тему единого управления

Есть ли способ изменить тему (светлая/темная) для каждого элемента управления в метро mahapps? Моя проблема в том, что у меня есть окно, в котором используется тема Light, но у меня есть его часть с очень темным фоном, и я не могу заставить ComboBox правильно отображаться, маленькая стрелка остается черной, даже если я меняю цвет фона на черный, а переднего плана на белый. Я нашел ссылки на изменение этой стрелки с некоторыми довольно серьезными хитростями вокруг шаблонов управления, но пока не очень повезло... Чтобы немного усложнить ситуацию, поле со списком находится внутри шаблона элемента для списка.

У меня есть всплывающее меню в другом месте, и я понял, что оно имеет именно тот стиль для полей со списком, потому что оно использует темную тему. Вот почему я спрашиваю, есть ли простой способ переключить тему под одним управлением?

Спасибо!


person Exhodus    schedule 07.05.2014    source источник


Ответы (1)


Не уверен, правильно ли я понял этот вопрос. Итак, вы хотите, чтобы ваш 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 магии :) Все элементы управления стилизованы с использованием кистей, которые они запрашивают и находят. Теперь Ресурс с наивысшим приоритетом области имеет приоритет, когда несколько кистей имеют одинаковое имя.

Таким образом, по сути BaseLight.xaml и BaseDark.xaml оба определяют одни и те же кисти с разными цветами.

При этом на основе того, какой ресурс применяется к элементу управления, в конечном итоге определяется, какую тему получает этот элемент управления или его дочерние элементы.

person Viv    schedule 07.05.2014
comment
Спасибо! Ваше решение работает и очень просто! Хотя я продолжаю получать сообщения об ошибках от VS2012, говоря: «Невозможно преобразовать объект типа «System.Windows.ResourceDictionary» в тип «Microsoft.Expression.Markup.DocumentModel.DocumentCompositeNode». сам работает без проблем, и я также продолжаю получать нулевые ошибки ссылки на объект в диалоговых окнах метро, ​​в то время как это то же самое, что и в демо-версии mahapps (и также работает...) - person Exhodus; 10.05.2014