Как поменять местами изображения на основе текущей темы WP7 - PullRequest
6 голосов
/ 26 августа 2011

Я не прошел сертификацию, потому что у меня есть изображение белого цвета. Поэтому, когда пользователь переключается на светлую тему, он терпит неудачу, потому что вы не можете его видеть. Как мне поменять это изображение на основе примененной темы?

Заранее спасибо

Ответы [ 3 ]

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

Вопрос Создание элемента управления изображения инвертирует его цвета в зависимости от темы имеет простой ответ только на XAML:

<Image HorizontalAlignment="Center"Stretch="None" Visibility="{StaticResource PhoneLightThemeVisibility}" Source="/MyApplication;component/imageDarkTheme.png" />
<Image HorizontalAlignment="Center" Stretch="None" Visibility="{StaticResource PhoneDarkThemeVisibility}"Source="/MyApplication;component/imageLightTheme.png" />
5 голосов
/ 26 августа 2011

В XAML

<Image Source="{Binding ImageSource}" />

В модели представления, содержащей свойство ImageSource

public string ImageSource
{
  get
  {
    if( (Visibility)App.Current.Resources["PhoneDarkThemeVisibility"] 
      == Visibility.Visible ) {
        return "/path/to/dark/image.png";

    } else {
        return "/path/to/light/image.png";

    }
  }
  private set {}
}

Это может не изменить изображение, если пользователь захоронит ваше приложение, изменит тему и переключится обратно на приложение.

Один из способов справиться с этим сценарием - кэшировать текущую настройку темы в конструкторе класса App, а затем сравнить ее с текущей настройкой в ​​App.Application_Activated, если они отличаются, вам нужно как-то указать, что приведенное выше представление модель должна запустить уведомление об изменении свойства для ImageSource.

0 голосов
/ 27 августа 2011

Для тех, кто следит за моими комментариями выше - мне пришлось напрямую переключиться с ImageBrush на изображение (xaml ниже)

<Button Tag="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="-10,20,0,0" BorderThickness="0" Width="105" Height="102" Click="ShowKioskOnMap_Click">
                                    <Image Source="../images/arrow.png" Width="55" Height="53" ImageOpened="Image_ImageOpened"/>
                                </Button>

Далее в конструкторе страницы, которую я использую - я выполнил поиск темычтобы предотвратить любые проблемы, когда состояние приложения восстанавливается, например, из-за телефонного звонка (или только из-за первой загрузки представления)

        InitializeComponent();

        theme = ""; //field level var (could make it dark by default if needed)
        if ((Visibility)App.Current.Resources["PhoneDarkThemeVisibility"] == Visibility.Visible)
        {
            theme = "dark";
        }
        else
        {
            theme = "light";
        }

И мне пришлось реализовать следующее в моем событии open, чтобыпереключатель на основе темы

    private void Image_ImageOpened(object sender, RoutedEventArgs e)
    {
        var brush = (sender as Image);
        if (brush.Stretch == Stretch.Uniform)
        {
            if (theme == "light")
                brush.Source = new BitmapImage(new Uri("../images/arrowLight.png", UriKind.Relative));

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