using CommunityToolkit.WinUI; using Harmonia.WinUI.ViewModels; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System.ComponentModel; namespace Harmonia.WinUI.Views; public sealed partial class PlaylistsView : UserControl { private readonly PlaylistsViewModel _viewModel; public PlaylistsView() { InitializeComponent(); _viewModel = (PlaylistsViewModel)DataContext; _viewModel.PropertyChanging += OnViewModelPropertyChanging; _viewModel.PropertyChanged += OnViewModelPropertyChanged; } private void OnViewModelPropertyChanging(object? sender, PropertyChangingEventArgs e) { switch (e.PropertyName) { case nameof(_viewModel.ActivePlaylist): UpdateListViewItemStyle(PlaylistItemStyle.Normal); break; } } private void OnViewModelPropertyChanged(object? sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case nameof(_viewModel.ActivePlaylist): UpdateListViewItemStyle(PlaylistItemStyle.Selected); break; } } private void UpdateListViewItemStyle(PlaylistItemStyle style) { ListViewItem listViewItem = (ListViewItem)PlaylistsListView.ContainerFromItem(_viewModel.ActivePlaylist); if (listViewItem is null) return; FrameworkElement? frameworkElement = TryGetFrameworkElement(listViewItem, "PlaylistListViewItem"); if (frameworkElement == null) return; string playlistItemIconBrushName = style == PlaylistItemStyle.Selected ? "SelectedPlaylistIconPath" : "PlaylistIconPath"; string playlistItemTitleBrushName = style == PlaylistItemStyle.Selected ? "SelectedPlaylistTitleTextBlock" : "PlaylistTitleTextBlock"; string playlistItemSubtitleBrushName = style == PlaylistItemStyle.Selected ? "SelectedPlaylistSubtitleTextBlock" : "PlaylistSubtitleTextBlock"; UpdateElementStyle(frameworkElement, "MusicNoteListPathIcon", playlistItemIconBrushName); UpdateElementStyle(frameworkElement, "PlaylistTitleTextBlock", playlistItemTitleBrushName); UpdateElementStyle(frameworkElement, "PlaylistSubtitleTextBlock", playlistItemSubtitleBrushName); } private static FrameworkElement? TryGetFrameworkElement(ListViewItem listViewItem, string elementName) { if (listViewItem.Name == elementName) { return listViewItem; } else { if (listViewItem.FindDescendant(elementName) is not FrameworkElement frameworkElement) return null; return frameworkElement; } } private void UpdateElementStyle(FrameworkElement dependencyObject, string elementName, string resourceName) { if (dependencyObject.FindDescendant(elementName) is not FrameworkElement frameworkElement) return; Resources.TryGetValue(resourceName, out object? resource); if (resource == null) Application.Current.Resources.TryGetValue(resourceName, out resource); if (resource is not Style style) return; frameworkElement.Style = style; } } public enum PlaylistItemStyle { Normal, Selected }