Skip to content

Commit cf97efd

Browse files
committed
Добавил кастомные сервисы для диалогов с поддержкой темизации.
1 parent 15ccc34 commit cf97efd

File tree

10 files changed

+270
-44
lines changed

10 files changed

+270
-44
lines changed

samples/XpfDemoApp/MainWindow.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@
111111

112112
<dxe:ComboBoxEdit
113113
x:Name="_themesComboBox"
114-
SelectedIndex="0"
115-
ValueMember="Value"
114+
SelectedIndex="1"
115+
ValueMember="Id"
116116
DisplayMember="DisplayName"
117117
IsTextEditable="False"
118118
ItemsSource="{me:EnumToItemsSource ss:UIThemes}"

src/dosymep.Xpf.Core.Ninject/NinjectExtensions.cs

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public static IKernel UseXtraTheme(this IKernel kernel) {
6161
/// <param name="kernel">Ninject контейнер.</param>
6262
/// <returns>Возвращает настроенный контейнер Ninject.</returns>
6363
/// <exception cref="ArgumentNullException">kernel is null.</exception>
64+
[Obsolete("Сервис применения темы теперь применяется автоматически")]
6465
public static IKernel UseXtraThemeUpdater(this IKernel kernel) {
6566
if(kernel == null) {
6667
throw new ArgumentNullException(nameof(kernel));
@@ -89,7 +90,7 @@ public static IKernel UseXtraDispatcher(this IKernel kernel) {
8990

9091
return kernel;
9192
}
92-
93+
9394
/// <summary>
9495
/// Добавляет в контейнер <see cref="IDispatcherService"/>.
9596
/// </summary>
@@ -127,7 +128,7 @@ public static IKernel UseXtraMessageBox(this IKernel kernel) {
127128
.WithPropertyValue(nameof(XtraProgressDialogService.UIThemeService),
128129
c => c.Kernel.Get<IUIThemeService>())
129130
.WithPropertyValue(nameof(XtraProgressDialogService.UIThemeUpdaterService),
130-
c => c.Kernel.Get<IUIThemeUpdaterService>())
131+
c => new XtraThemeUpdaterService())
131132
.WithPropertyValue(nameof(IAttachableService.AllowAttach), false);
132133

133134
return kernel;
@@ -152,7 +153,7 @@ public static IKernel UseXtraMessageBox<T>(this IKernel kernel) {
152153
.WithPropertyValue(nameof(XtraProgressDialogService.UIThemeService),
153154
c => c.Kernel.Get<IUIThemeService>())
154155
.WithPropertyValue(nameof(XtraProgressDialogService.UIThemeUpdaterService),
155-
c => c.Kernel.Get<IUIThemeUpdaterService>())
156+
c => new XtraThemeUpdaterService())
156157
.WithPropertyValue(nameof(IAttachableService.AllowAttach), true);
157158

158159
return kernel;
@@ -182,7 +183,7 @@ public static IKernel UseXtraProgressDialog(this IKernel kernel,
182183
.WithPropertyValue(nameof(XtraProgressDialogService.UIThemeService),
183184
c => c.Kernel.Get<IUIThemeService>())
184185
.WithPropertyValue(nameof(XtraProgressDialogService.UIThemeUpdaterService),
185-
c => c.Kernel.Get<IUIThemeUpdaterService>())
186+
c => new XtraThemeUpdaterService())
186187
.WithPropertyValue(nameof(IAttachableService.AllowAttach), false)
187188
.WithPropertyValue(nameof(XtraProgressDialogService.DisplayTitleFormat), displayTitleFormat)
188189
.WithPropertyValue(nameof(XtraProgressDialogService.StepValue), stepValue)
@@ -218,7 +219,7 @@ public static IKernel UseXtraProgressDialog<T>(this IKernel kernel,
218219
.WithPropertyValue(nameof(XtraProgressDialogService.UIThemeService),
219220
c => c.Kernel.Get<IUIThemeService>())
220221
.WithPropertyValue(nameof(XtraProgressDialogService.UIThemeUpdaterService),
221-
c => c.Kernel.Get<IUIThemeUpdaterService>())
222+
c => new XtraThemeUpdaterService())
222223
.WithPropertyValue(nameof(XtraProgressDialogService.DisplayTitleFormat), displayTitleFormat)
223224
.WithPropertyValue(nameof(XtraProgressDialogService.StepValue), stepValue)
224225
.WithPropertyValue(nameof(XtraProgressDialogService.Indeterminate), indeterminate);
@@ -324,6 +325,28 @@ public static IKernel UseXtraNotifications<T>(this IKernel kernel,
324325

325326
return kernel;
326327
}
328+
329+
/// <summary>
330+
/// Добавляет в контейнер <see cref="ILocalizationService"/>.
331+
/// </summary>
332+
/// <param name="kernel">Ninject контейнер.</param>
333+
/// <param name="resourceName">Наименование ресурсов.</param>
334+
/// <param name="defaultCulture">Языковые настройки по умолчанию. Значение по умолчанию <see cref="CultureInfo.CurrentUICulture"/>.</param>
335+
/// <returns>Возвращает настроенный контейнер Ninject.</returns>
336+
public static IKernel UseXtraLocalization(this IKernel kernel, string resourceName,
337+
CultureInfo? defaultCulture = default) {
338+
kernel.Bind<ILocalizationService>().To<XtraLocalizationService>()
339+
.InSingletonScope()
340+
.WithConstructorArgument(nameof(resourceName), resourceName)
341+
.WithConstructorArgument(nameof(defaultCulture), defaultCulture ?? CultureInfo.CurrentUICulture)
342+
.OnActivation((context, service) =>
343+
service.SetLocalization(
344+
context.Kernel.TryGet<ILanguageService>()?.HostLanguage
345+
?? defaultCulture
346+
?? CultureInfo.CurrentUICulture));
347+
348+
return kernel;
349+
}
327350

328351
/// <summary>
329352
/// Добавляет в контейнер <see cref="IOpenFileDialogService"/>.
@@ -366,6 +389,10 @@ public static IKernel UseXtraOpenFileDialog(this IKernel kernel,
366389

367390
kernel.Bind<IOpenFileDialogService>()
368391
.To<XtraOpenFileDialogService>()
392+
.WithPropertyValue(nameof(XtraOpenFileDialogService.UIThemeService),
393+
c => c.Kernel.Get<IUIThemeService>())
394+
.WithPropertyValue(nameof(XtraOpenFileDialogService.UIThemeUpdaterService),
395+
c => new XtraThemeUpdaterService())
369396
.WithPropertyValue(nameof(IAttachableService.AllowAttach), false)
370397
.WithPropertyValue(nameof(IOpenDialogServiceBase.Multiselect), multiSelect)
371398
.WithPropertyValue(nameof(IFileDialogServiceBase.AddExtension), addExtension)
@@ -430,6 +457,10 @@ public static IKernel UseXtraOpenFileDialog<T>(this IKernel kernel,
430457
kernel.Bind<IOpenFileDialogService>()
431458
.To<XtraOpenFileDialogService>()
432459
.WhenInjectedInto<T>()
460+
.WithPropertyValue(nameof(XtraOpenFileDialogService.UIThemeService),
461+
c => c.Kernel.Get<IUIThemeService>())
462+
.WithPropertyValue(nameof(XtraOpenFileDialogService.UIThemeUpdaterService),
463+
c => new XtraThemeUpdaterService())
433464
.WithPropertyValue(nameof(IAttachableService.AllowAttach), true)
434465
.WithPropertyValue(nameof(IOpenDialogServiceBase.Multiselect), multiSelect)
435466
.WithPropertyValue(nameof(IFileDialogServiceBase.AddExtension), addExtension)
@@ -493,6 +524,10 @@ public static IKernel UseXtraSaveFileDialog(this IKernel kernel,
493524

494525
kernel.Bind<ISaveFileDialogService>()
495526
.To<XtraSaveFileDialogService>()
527+
.WithPropertyValue(nameof(XtraSaveFileDialogService.UIThemeService),
528+
c => c.Kernel.Get<IUIThemeService>())
529+
.WithPropertyValue(nameof(XtraSaveFileDialogService.UIThemeUpdaterService),
530+
c => new XtraThemeUpdaterService())
496531
.WithPropertyValue(nameof(IAttachableService.AllowAttach), false)
497532
.WithPropertyValue(nameof(IFileDialogServiceBase.AddExtension), addExtension)
498533
.WithPropertyValue(nameof(IFileDialogServiceBase.AutoUpgradeEnabled), autoUpgradeEnabled)
@@ -514,27 +549,6 @@ public static IKernel UseXtraSaveFileDialog(this IKernel kernel,
514549
return kernel;
515550
}
516551

517-
/// <summary>
518-
/// Добавляет в контейнер <see cref="ILocalizationService"/>.
519-
/// </summary>
520-
/// <param name="kernel">Ninject контейнер.</param>
521-
/// <param name="resourceName">Наименование ресурсов.</param>
522-
/// <param name="defaultCulture">Языковые настройки по умолчанию. Значение по умолчанию <see cref="CultureInfo.CurrentUICulture"/>.</param>
523-
/// <returns>Возвращает настроенный контейнер Ninject.</returns>
524-
public static IKernel UseXtraLocalization(this IKernel kernel, string resourceName, CultureInfo? defaultCulture = default) {
525-
kernel.Bind<ILocalizationService>().To<XtraLocalizationService>()
526-
.InSingletonScope()
527-
.WithConstructorArgument(nameof(resourceName), resourceName)
528-
.WithConstructorArgument(nameof(defaultCulture), defaultCulture ?? CultureInfo.CurrentUICulture)
529-
.OnActivation((context, service) =>
530-
service.SetLocalization(
531-
context.Kernel.TryGet<ILanguageService>()?.HostLanguage
532-
?? defaultCulture
533-
?? CultureInfo.CurrentUICulture));
534-
535-
return kernel;
536-
}
537-
538552
/// <summary>
539553
/// Добавляет в контейнер <see cref="ISaveFileDialogService"/>.
540554
/// </summary>
@@ -581,6 +595,10 @@ public static IKernel UseXtraSaveFileDialog<T>(this IKernel kernel,
581595
kernel.Bind<ISaveFileDialogService>()
582596
.To<XtraSaveFileDialogService>()
583597
.WhenInjectedInto<T>()
598+
.WithPropertyValue(nameof(XtraSaveFileDialogService.UIThemeService),
599+
c => c.Kernel.Get<IUIThemeService>())
600+
.WithPropertyValue(nameof(XtraSaveFileDialogService.UIThemeUpdaterService),
601+
c => new XtraThemeUpdaterService())
584602
.WithPropertyValue(nameof(IAttachableService.AllowAttach), true)
585603
.WithPropertyValue(nameof(IFileDialogServiceBase.AddExtension), addExtension)
586604
.WithPropertyValue(nameof(IFileDialogServiceBase.AutoUpgradeEnabled), autoUpgradeEnabled)
@@ -631,6 +649,10 @@ public static IKernel UseXtraOpenFolderDialog(this IKernel kernel,
631649

632650
kernel.Bind<IOpenFolderDialogService>()
633651
.To<XtraOpenFolderDialogService>()
652+
.WithPropertyValue(nameof(XtraOpenFolderDialogService.UIThemeService),
653+
c => c.Kernel.Get<IUIThemeService>())
654+
.WithPropertyValue(nameof(XtraOpenFolderDialogService.UIThemeUpdaterService),
655+
c => new XtraThemeUpdaterService())
634656
.WithPropertyValue(nameof(IAttachableService.AllowAttach), false)
635657
.WithPropertyValue(nameof(IOpenDialogServiceBase.Multiselect), multiSelect)
636658
.WithPropertyValue(nameof(IFileDialogServiceBase.AutoUpgradeEnabled), autoUpgradeEnabled)
@@ -676,6 +698,10 @@ public static IKernel UseXtraOpenFolderDialog<T>(this IKernel kernel,
676698
kernel.Bind<IOpenFolderDialogService>()
677699
.To<XtraOpenFolderDialogService>()
678700
.WhenInjectedInto<T>()
701+
.WithPropertyValue(nameof(XtraOpenFolderDialogService.UIThemeService),
702+
c => c.Kernel.Get<IUIThemeService>())
703+
.WithPropertyValue(nameof(XtraOpenFolderDialogService.UIThemeUpdaterService),
704+
c => new XtraThemeUpdaterService())
679705
.WithPropertyValue(nameof(IAttachableService.AllowAttach), true)
680706
.WithPropertyValue(nameof(IOpenDialogServiceBase.Multiselect), multiSelect)
681707
.WithPropertyValue(nameof(IFileDialogServiceBase.AutoUpgradeEnabled), autoUpgradeEnabled)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using DevExpress.Utils.CommonDialogs;
2+
using DevExpress.Xpf.Dialogs;
3+
4+
using dosymep.SimpleServices;
5+
using dosymep.Xpf.Core.SimpleServices.DxCustomServices.DXCustomDialogs;
6+
7+
namespace dosymep.Xpf.Core.SimpleServices.DxCustomServices {
8+
/// <summary>
9+
/// Internal use only.
10+
/// </summary>
11+
public class CustomDXOpenFileDialogService : DXOpenFileDialogService {
12+
/// <summary>
13+
/// Сервис по получению тем.
14+
/// </summary>
15+
public IUIThemeService UIThemeService { get; set; }
16+
17+
/// <summary>
18+
/// Сервис по установке тем.
19+
/// </summary>
20+
public IUIThemeUpdaterService UIThemeUpdaterService { get; set; }
21+
22+
23+
/// <summary>
24+
/// Internal use only.
25+
/// </summary>
26+
protected override IFileDialog CreateFileDialogAdapter() =>
27+
new CustomDXOpenFileDialog(() => UIThemeService, () => UIThemeUpdaterService);
28+
}
29+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using DevExpress.Utils.CommonDialogs;
2+
using DevExpress.Xpf.Dialogs;
3+
4+
using dosymep.SimpleServices;
5+
using dosymep.Xpf.Core.SimpleServices.DxCustomServices.DXCustomDialogs;
6+
7+
namespace dosymep.Xpf.Core.SimpleServices.DxCustomServices {
8+
/// <summary>
9+
/// Internal use only.
10+
/// </summary>
11+
public class CustomDXOpenFolderDialogService : DXOpenFolderDialogService {
12+
/// <summary>
13+
/// Сервис по получению тем.
14+
/// </summary>
15+
public IUIThemeService UIThemeService { get; set; }
16+
17+
/// <summary>
18+
/// Сервис по установке тем.
19+
/// </summary>
20+
public IUIThemeUpdaterService UIThemeUpdaterService { get; set; }
21+
22+
/// <summary>
23+
/// Internal use only.
24+
/// </summary>
25+
protected override IFileDialog CreateFileDialogAdapter() =>
26+
new CustomDXOpenFileDialog(() => UIThemeService, () => UIThemeUpdaterService);
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using DevExpress.Utils.CommonDialogs;
2+
using DevExpress.Xpf.Dialogs;
3+
4+
using dosymep.SimpleServices;
5+
using dosymep.Xpf.Core.SimpleServices.DxCustomServices.DXCustomDialogs;
6+
7+
namespace dosymep.Xpf.Core.SimpleServices.DxCustomServices {
8+
/// <summary>
9+
/// Internal use only.
10+
/// </summary>
11+
public class CustomDXSaveFileDialogService : DXSaveFileDialogService {
12+
/// <summary>
13+
/// Сервис по получению тем.
14+
/// </summary>
15+
public IUIThemeService UIThemeService { get; set; }
16+
17+
/// <summary>
18+
/// Сервис по установке тем.
19+
/// </summary>
20+
public IUIThemeUpdaterService UIThemeUpdaterService { get; set; }
21+
22+
/// <summary>
23+
/// Internal use only.
24+
/// </summary>
25+
protected override IFileDialog CreateFileDialogAdapter() =>
26+
new CustomDXSaveFileDialog(() => UIThemeService, () => UIThemeUpdaterService);
27+
}
28+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System;
2+
using System.Windows;
3+
4+
using DevExpress.Xpf.Core;
5+
using DevExpress.Xpf.Dialogs;
6+
7+
using dosymep.SimpleServices;
8+
9+
namespace dosymep.Xpf.Core.SimpleServices.DxCustomServices.DXCustomDialogs {
10+
internal class CustomDXOpenFileDialog : DXOpenFileDialog {
11+
private readonly Func<IUIThemeService> _theme;
12+
private readonly Func<IUIThemeUpdaterService> _themeUpdaterService;
13+
14+
public CustomDXOpenFileDialog(Func<IUIThemeService> theme, Func<IUIThemeUpdaterService> themeUpdaterService) {
15+
_theme = theme;
16+
_themeUpdaterService = themeUpdaterService;
17+
}
18+
19+
protected override IDialogHost CreateDialogHost(IntPtr hwndOwner) {
20+
FileDialogWindow fileDialogWindow = new FileDialogWindow {
21+
Title = string.IsNullOrEmpty(Title) ? GetDefaultTitle() : Title,
22+
WindowStartupLocation = WindowStartupLocation.CenterOwner,
23+
WindowStyle = WindowStyle.ToolWindow,
24+
ShowInTaskbar = false
25+
};
26+
27+
_themeUpdaterService().SetTheme(_theme().HostTheme, fileDialogWindow);
28+
29+
return fileDialogWindow;
30+
}
31+
}
32+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System;
2+
using System.Windows;
3+
4+
using DevExpress.Xpf.Core;
5+
using DevExpress.Xpf.Dialogs;
6+
7+
using dosymep.SimpleServices;
8+
9+
namespace dosymep.Xpf.Core.SimpleServices.DxCustomServices.DXCustomDialogs {
10+
internal class CustomDXSaveFileDialog : DXSaveFileDialog {
11+
private readonly Func<IUIThemeService> _theme;
12+
private readonly Func<IUIThemeUpdaterService> _themeUpdaterService;
13+
14+
public CustomDXSaveFileDialog(Func<IUIThemeService> theme, Func<IUIThemeUpdaterService> themeUpdaterService) {
15+
_theme = theme;
16+
_themeUpdaterService = themeUpdaterService;
17+
}
18+
19+
protected override IDialogHost CreateDialogHost(IntPtr hwndOwner) {
20+
FileDialogWindow fileDialogWindow = new FileDialogWindow {
21+
Title = string.IsNullOrEmpty(Title) ? GetDefaultTitle() : Title,
22+
WindowStartupLocation = WindowStartupLocation.CenterOwner,
23+
WindowStyle = WindowStyle.ToolWindow,
24+
ShowInTaskbar = false
25+
};
26+
27+
_themeUpdaterService().SetTheme(_theme().HostTheme, fileDialogWindow);
28+
29+
return fileDialogWindow;
30+
}
31+
}
32+
}

src/dosymep.Xpf.Core/SimpleServices/XtraOpenFileDialogService.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,41 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.IO;
34
using System.Linq;
45
using System.Windows;
56

67
using DevExpress.Mvvm.UI;
7-
using DevExpress.Xpf.Dialogs;
8+
using DevExpress.Xpf.Core;
89

910
using dosymep.SimpleServices;
11+
using dosymep.Xpf.Core.SimpleServices.DxCustomServices;
1012

1113
namespace dosymep.Xpf.Core.SimpleServices {
1214
/// <summary>
1315
/// Класс сервиса открытия диалога выбора файла.
1416
/// </summary>
15-
public class XtraOpenFileDialogService : XtraBaseWindowService<DXOpenFileDialogService>, IOpenFileDialogService {
17+
public class XtraOpenFileDialogService : XtraBaseWindowService<CustomDXOpenFileDialogService>, IOpenFileDialogService {
18+
/// <summary>
19+
/// Сервис по получению тем.
20+
/// </summary>
21+
public IUIThemeService UIThemeService {
22+
get => _serviceBase.UIThemeService;
23+
set => _serviceBase.UIThemeService = value;
24+
}
25+
26+
/// <summary>
27+
/// Сервис по установке тем.
28+
/// </summary>
29+
public IUIThemeUpdaterService UIThemeUpdaterService {
30+
get => _serviceBase.UIThemeUpdaterService;
31+
set => _serviceBase.UIThemeUpdaterService = value;
32+
}
33+
1634
/// <summary>
1735
/// Создает экземпляр сервиса открытия диалога выбора файла.
1836
/// </summary>
1937
public XtraOpenFileDialogService()
20-
: base(new DXOpenFileDialogService()) {
38+
: base(new CustomDXOpenFileDialogService()) {
2139
}
2240

2341
/// <inheritdoc />

0 commit comments

Comments
 (0)