UWP RequestedTheme не согласован в ListView и ListViewItem - PullRequest
0 голосов
/ 08 апреля 2020

My NowPlayFullPage имеет PlaylistControl , который в основном является ListView.

<local:PlaylistControl
    x:Name="FullPlaylistControl"
    Margin="10,10,10,0"
    AllowReorder="True"
    AlternatingRowColor="False"
    Background="Transparent"
    IsNowPlaying="True"
    RequestedTheme="Dark" />

ItemTemplate из PlaylistControl выглядит следующим образом:

<local:PlaylistControlItem
    Data="{x:Bind}"
    DataContext="{x:Bind}"
    RequestedTheme="{Binding ElementName=PlaylistController, Path=RequestedTheme}"
    ShowAlbumText="{Binding ElementName=PlaylistController, Path=ShowAlbumText}" />

И в Loaded событии PlaylistControlItem я вызвал функцию SetTextColor

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    MediaHelper.SwitchMusicListeners.Add(this);
    SetTextColor(MediaHelper.CurrentMusic);
}

public void SetTextColor(Music music)
{
    if (Data == music)
    {
        TitleTextBlock.Foreground = ArtistTextButton.Foreground = AlbumTextButton.Foreground = DurationTextBlock.Foreground =
        LongArtistTextButton.Foreground = LongArtistAlbumPanelDot.Foreground = LongAlbumTextButton.Foreground = ColorHelper.HighlightBrush;
        TextColorChanged = true;
    }
    else if (TextColorChanged)
    {
        if (RequestedTheme == ElementTheme.Dark)
        {
            TitleTextBlock.Foreground = ColorHelper.WhiteBrush;
            ArtistTextButton.Foreground = AlbumTextButton.Foreground = DurationTextBlock.Foreground =
            LongArtistTextButton.Foreground = LongArtistAlbumPanelDot.Foreground = LongAlbumTextButton.Foreground = ColorHelper.GrayBrush;
        }
        else
        {
            TitleTextBlock.Foreground = ArtistTextButton.Foreground = AlbumTextButton.Foreground = DurationTextBlock.Foreground =
            LongArtistTextButton.Foreground = LongArtistAlbumPanelDot.Foreground = LongAlbumTextButton.Foreground = ColorHelper.BlackBrush;
        }
        TextColorChanged = false;
    }
}

Мой вопрос: почему RequestedTheme в SetTextColor, вызываемом в событии Loaded, имеют значение ElementTheme.Default вместо ElementTheme.Dark? Когда RequestTheme из PlaylistControlItem содержит значение Dark, чтобы мой цвет текста мог быть установлен правильно?

1 Ответ

1 голос
/ 08 апреля 2020

Рекомендуется, чтобы он справился с этим, используя ThemeResource в XAML, а не в коде, см .: https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/themeresource-markup-extension

Но для ответа на ваш вопрос это ожидаемое поведение. ElementTheme.Default просто означает, что элемент не имеет переопределенной темы и использует стандартную тему приложения. Два других значения означают, что элемент специально переопределил тему. App.Current.RequestedTheme дает актуальную тему приложения. FrameworkElement.RequestedTheme всегда будет иметь значение Default, если вы явно не установите его для чего-то другого в этом указанном c элементе. Все его дочерние элементы будут по-прежнему иметь значение Default.

Обратите внимание, что вы должны сравнивать с ActualTheme, а не RequestedTheme, поскольку родитель мог заставить его использовать тему, отличную от приложения если его значение все еще равно ElementTheme.Default.

Подобный ниже метод может помочь вам получить правильное значение Light / Dark.

public static ElementTheme GetEffectiveTheme(FrameworkElement e)
{
    if (e.ActualTheme == ElementTheme.Default)
        return App.Current.RequestedTheme == ApplicationTheme.Dark ? ElementTheme.Dark : ElementTheme.Light;

    return e.ActualTheme;
}

Но также просто используйте ThemeResources. Они автоматически переоценивают изменение темы, не требуя никакого кода или прослушивателей событий.

...