/
githubmirror
/
Files
Обзор
Документация
Войти
/
githubmirror
/
Files
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Files.App/Views/Properties/MainPropertiesPage.xaml.cs
133 строки
4 KB
yair100
Code Quality: Implemented sidebar control in Properties Window (#18692)
09 июл 2026, 17:19
Не верифицирован
09 июл 2026, 17:19
b6681a5
Код
Авторство
О чём код?
// Copyright (c) Files Community // Licensed under the MIT License. using Files.App.Controls; using Files.App.ViewModels.Properties; using Microsoft.UI.Input; using Microsoft.UI.Windowing; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Navigation; using Windows.Graphics; using Windows.System; namespace Files.App.Views.Properties { public sealed partial class MainPropertiesPage : BasePropertiesPage { private IAppThemeModeService AppThemeModeService { get; } = Ioc.Default.GetRequiredService<IAppThemeModeService>(); private AppWindow AppWindow => Window.AppWindow; private Window Window; private MainPropertiesViewModel MainPropertiesViewModel { get; set; } public MainPropertiesPage() { InitializeComponent(); if (AppLanguageHelper.IsPreferredLanguageRtl) FlowDirection = FlowDirection.RightToLeft; } // Navigates to specified properties page public bool TryNavigateToPage(PropertiesNavigationViewItemType pageType) { var page = MainPropertiesViewModel.NavigationItems.FirstOrDefault(item => item.ItemType == pageType); if (page is null) return false; MainPropertiesViewModel.SelectedNavigationItem = page; return true; } private void PropertiesSidebar_ItemInvoked(object sender, ItemInvokedEventArgs e) { if (sender is not SidebarItem { Item: PropertiesNavigationItem navItem }) return; MainPropertiesViewModel.SelectedNavigationItem = navItem; } protected override void OnNavigatedTo(NavigationEventArgs e) { var parameter = (PropertiesPageNavigationParameter)e.Parameter; Window = parameter.Window; base.OnNavigatedTo(e); MainPropertiesViewModel = new(Window, MainContentFrame, BaseProperties, parameter); } private void Page_Loaded(object sender, RoutedEventArgs e) { AppThemeModeService.AppThemeModeChanged += AppThemeModeService_AppThemeModeChanged; Window.Closed += Window_Closed; AppThemeModeService.ApplyResources(); UpdatePageLayout(this.Width); PropertiesSidebar.SelectedItem = MainPropertiesViewModel.SelectedNavigationItem; Window.RaiseSetTitleBarDragRegion(SetTitleBarDragRegion); Window.AppWindow.Changed += AppWindow_Changed; } private int SetTitleBarDragRegion(InputNonClientPointerSource source, SizeInt32 size, double scaleFactor, Func<UIElement, RectInt32?, RectInt32> getScaledRect) { source.SetRegionRects(NonClientRegionKind.Passthrough, [getScaledRect(BackwardNavigationButton, null)]); return (int)TitlebarArea.ActualHeight; } private void Page_SizeChanged(object sender, SizeChangedEventArgs e) => UpdatePageLayout(e.NewSize.Width); private void Page_KeyDown(object sender, KeyRoutedEventArgs e) { if (e.Key.Equals(VirtualKey.Escape)) Window.Close(); } private void UpdatePageLayout(double pageWidth) { VisualStateManager.GoToState(this, pageWidth < 600 ? "Narrow" : "Wide", true); } private async void AppThemeModeService_AppThemeModeChanged(object? sender, EventArgs e) { if (Parent is null) return; await DispatcherQueue.EnqueueOrInvokeAsync(() => { AppThemeModeService.SetAppThemeMode(Window, Window.AppWindow.TitleBar, AppThemeModeService.AppThemeMode, false); }); } private void Window_Closed(object sender, WindowEventArgs args) { AppThemeModeService.AppThemeModeChanged -= AppThemeModeService_AppThemeModeChanged; Window.Closed -= Window_Closed; Window.AppWindow.Changed -= AppWindow_Changed; if (MainPropertiesViewModel.ChangedPropertiesCancellationTokenSource is not null && !MainPropertiesViewModel.ChangedPropertiesCancellationTokenSource.IsCancellationRequested) { MainPropertiesViewModel.ChangedPropertiesCancellationTokenSource.Cancel(); } } private void AppWindow_Changed(AppWindow sender, AppWindowChangedEventArgs e) { Window.RaiseSetTitleBarDragRegion(SetTitleBarDragRegion); } public override async Task<bool> SaveChangesAsync() => await Task.FromResult(false); public override void Dispose() { } } }