Как создать кисть, которая поддерживает как темные, так и светлые темы? - PullRequest
3 голосов
/ 11 сентября 2011

Я работаю с WP7 и хочу создать собственную кисть (в качестве локального ресурса), которая использует разные цвета для темных и светлых тем (для instace, красный, если тема черно-синяя, если она белая ).

Как мне это сделать?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 18 сентября 2011

Интегрированные / системные кисти не меняют свои свойства в зависимости от темы, другой набор кистей включен в зависимости от текущей темы.Вы можете увидеть различные версии этого в %programfiles%\Microsoft SDKs\Windows Phone\v7.1\Design

Я написал custom ResourceDictionary, который реализует поддержку тем точно так же: путем загрузки соответствующего словаря тем в зависимости отсветлая / темная тема.

Вот пример, который использует его.Он работает в конструкторе Visual Studio так же, как и в Blend, но не поддерживает предварительный просмотр белой темы в Blend, потому что Blend загружает ресурсы способом, который невозможно воспроизвести.

<Application.Resources>
    <custom:ThemeResourceDictionary>
        <custom:ThemeResourceDictionary.LightResources>
            <ResourceDictionary Source="/ThemeManagement;component/Resources/Light.xaml" />
        </custom:ThemeResourceDictionary.LightResources>
        <custom:ThemeResourceDictionary.DarkResources>
            <ResourceDictionary Source="/ThemeManagement;component/Resources/Dark.xaml" />
        </custom:ThemeResourceDictionary.DarkResources>
    </custom:ThemeResourceDictionary>
</Application.Resources>

Приведенный выше код загружает ресурсыиз двух разных файлов, но их можно так же легко объявить встроенными, как и любой другой ResourceDictionary.

Источник для ThemeResourceDictionary доступен в моем исходном сообщении в блоге, но он также находится в в другом переполнении стека.вопрос на случай, если мой блог когда-нибудь взорвется.

2 голосов
/ 12 сентября 2011

Вам придется самостоятельно управлять кистями, которые вы применяете к элементам, из кода.В настоящее время я обнаружил, что это единственный способ настройки на другой PhoneBackgroundColor.

Например:

В xaml

<TextBlock Text="Some text" Foreground="{Binding VariableTextColor}"/>

В коде

var backgroundColor = (System.Windows.Media.Color)Application.Current.Resources["PhoneBackgroundColor"];

if(backgroundColor == "#FF000000") //Dark theme selected
VariableTextColor = RedBrush;
else
VariableTextColor = WhiteBrush;

Еще один подход с использованием PhoneDarkThemeVisibility ресурс:

    /// <summary>
    /// Determines if the application is running in the dark theme
    /// </summary>
    private bool IsDarkTheme
    {
        get
        {
            if (IsDesignMode)
            {
                return true;
            }
            else
            {
                return (Visibility)Application.Current
                    .Resources["PhoneDarkThemeVisibility"] == Visibility.Visible;
            }
        }
    } 
0 голосов
/ 16 июня 2015

Подход, описанный Ричардом Сзалайем, в моем случае не сработал, потому что я нуждался в нем в UserControl или из-за чего-то другого, однако он действительно близок к ответу.Мой проект Silverlight для Windows Phone 8.1, и я использую Visual Studio 2013 с последними обновлениями.Вероятно, это была проблема.Это то, что помогло в моем случае

   <UserControl.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary  Source="/Application;component/Controls/NumberKeyboard.Dark.xaml" />
            <windows:ThemeSelector>
               <windows:ThemeSelector.Dark>
                  <ResourceDictionary Source="/Application;component/Controls/NumberKeyboard.Dark.xaml" />
               </windows:ThemeSelector.Dark>
               <windows:ThemeSelector.Light>
                  <ResourceDictionary Source="/Application;component/Controls/NumberKeyboard.Light.xaml" />
               </windows:ThemeSelector.Light>
            </windows:ThemeSelector>
         </ResourceDictionary.MergedDictionaries>

         <Style x:Key="KeyboardButton" TargetType="controls:SimpleButton">
            <Setter Property="FontSize" Value="45" />
            <Setter Property="BorderThickness" Value="0" />
            <Setter Property="Margin" Value="0" />
            <Setter Property="Padding" Value="0" />
            <Setter Property="HorizontalAlignment" Value="Stretch" />
            <Setter Property="VerticalAlignment" Value="Stretch" />
         </Style>
         <Style x:Key="NumberButton" TargetType="controls:SimpleButton" BasedOn="{StaticResource KeyboardButton}">
            <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}" />
            <Setter Property="Background" Value="{StaticResource ButtonBrush}" />
         </Style>
         <Style x:Key="ControlButton" TargetType="controls:SimpleButton" BasedOn="{StaticResource KeyboardButton}">
            <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}" />
            <Setter Property="Background" Value="{StaticResource ButtonBrush}" />
         </Style>
         <Style x:Key="ActionButton" TargetType="controls:SimpleButton" BasedOn="{StaticResource KeyboardButton}">
            <Setter Property="Foreground" Value="{StaticResource PhoneBackgroundBrush}" />
            <Setter Property="Background" Value="{StaticResource PhoneForegroundBrush}" />
         </Style>
      </ResourceDictionary>
   </UserControl.Resources>

Строка ключа <ResourceDictionary Source="/Application;component/Controls/NumberKeyboard.Dark.xaml" /> прямо перед <windows:ThemeSelector>.Эта строка необходима для того, чтобы конструктор VS отображал все правильно, а ThemeSelector переопределяет стили во время выполнения в соответствии с темой или светом текущей темы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...