fix: 优化dialog样式和修复dialog的相关bug

This commit is contained in:
姚彪
2023-12-21 23:07:06 +08:00
parent c2d5982719
commit 37f2d8eb81
37 changed files with 430 additions and 111 deletions

View File

@@ -10,7 +10,7 @@ using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Avalonia.Threading;
using DownKyi.Core.Settings;
using DownKyi.Services;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Services.Download;
using DownKyi.ViewModels;
using DownKyi.ViewModels.Dialogs;
@@ -61,6 +61,7 @@ public partial class App : PrismApplication
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IDialogService, DialogService>();
containerRegistry.Register<IDialogWindow, DialogWindow>();
// pages
containerRegistry.RegisterForNavigation<ViewIndex>(ViewIndexViewModel.Tag);
containerRegistry.RegisterForNavigation<ViewLogin>(ViewLoginViewModel.Tag);
@@ -105,8 +106,7 @@ public partial class App : PrismApplication
// UserSpace
containerRegistry.RegisterForNavigation<ViewArchive>(ViewArchiveViewModel.Tag);
// containerRegistry.RegisterForNavigation<Views.UserSpace.ViewChannel>(ViewModels.UserSpace.ViewChannelViewModel.Tag);
containerRegistry.RegisterForNavigation<Views.UserSpace.ViewSeasonsSeries>(ViewModels.UserSpace
.ViewSeasonsSeriesViewModel.Tag);
containerRegistry.RegisterForNavigation<Views.UserSpace.ViewSeasonsSeries>(ViewModels.UserSpace.ViewSeasonsSeriesViewModel.Tag);
// dialogs
containerRegistry.RegisterDialog<ViewAlertDialog>(ViewAlertDialogViewModel.Tag);

View File

@@ -35,4 +35,12 @@
<ItemGroup>
<ProjectReference Include="..\DownKyi.Core\DownKyi.Core.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="PrismExtension\Dialog\DialogWindow.axaml.cs">
<DependentUpon>DialogWindow.axaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,77 @@
using System;
using Avalonia.Controls;
using Prism.Mvvm;
namespace DownKyi.PrismExtension.Common;
/// <summary>
/// Helper class for MVVM.
/// </summary>
public static class MvvmHelpers
{
/// <summary>
/// Sets the AutoWireViewModel property to true for the <paramref name="viewOrViewModel"/>.
/// </summary>
/// <remarks>
/// The AutoWireViewModel property will only be set to true if the view
/// is a <see cref="FrameworkElement"/>, the DataContext of the view is null, and
/// the AutoWireViewModel property of the view is null.
/// </remarks>
/// <param name="viewOrViewModel">The View or ViewModel.</param>
internal static void AutowireViewModel(object viewOrViewModel)
{
if (viewOrViewModel is Control view &&
view.DataContext is null &&
ViewModelLocator.GetAutoWireViewModel(view) is null)
{
ViewModelLocator.SetAutoWireViewModel(view, true);
}
}
////#endif
/// <summary>
/// Perform an <see cref="Action"/> on a view and viewmodel.
/// </summary>
/// <remarks>
/// The action will be performed on the view and its viewmodel if they implement <typeparamref name="T"/>.
/// </remarks>
/// <typeparam name="T">The <see cref="Action{T}"/> parameter type.</typeparam>
/// <param name="view">The view to perform the <see cref="Action{T}"/> on.</param>
/// <param name="action">The <see cref="Action{T}"/> to perform.</param>
public static void ViewAndViewModelAction<T>(object view, Action<T> action) where T : class
{
if (view is T viewAsT)
action(viewAsT);
if (view is Control element && element.DataContext is T viewModelAsT)
{
action(viewModelAsT);
}
}
/// <summary>
/// Get an implementer from a view or viewmodel.
/// </summary>
/// <remarks>
/// If the view implements <typeparamref name="T"/> it will be returned.
/// Otherwise if the view's <see cref="FrameworkElement.DataContext"/> implements <typeparamref name="T"/> it will be returned instead.
/// </remarks>
/// <typeparam name="T">The implementer type to get.</typeparam>
/// <param name="view">The view to get <typeparamref name="T"/> from.</param>
/// <returns>view or viewmodel as <typeparamref name="T"/>.</returns>
public static T GetImplementerFromViewOrViewModel<T>(object view) where T : class
{
if (view is T viewAsT)
{
return viewAsT;
}
if (view is Control element && element.DataContext is T vmAsT)
{
return vmAsT;
}
return null;
}
}

View File

@@ -0,0 +1,30 @@
using Avalonia;
using Avalonia.Styling;
namespace DownKyi.PrismExtension.Dialog;
public class Dialog : Prism.Services.Dialogs.Dialog
{
public static readonly AvaloniaProperty ThemeProperty =
AvaloniaProperty.RegisterAttached<AvaloniaObject, ControlTheme>("Theme", typeof(Dialog));
/// <summary>
/// Gets the value for the <see cref="ThemeProperty"/> attached property.
/// </summary>
/// <param name="obj">The target element.</param>
/// <returns>The <see cref="ThemeProperty"/> attached to the <paramref name="obj"/> element.</returns>
public static ControlTheme? GetTheme(AvaloniaObject obj)
{
return (ControlTheme?)obj.GetValue(ThemeProperty);
}
/// <summary>
/// Sets the <see cref="ThemeProperty"/> attached property.
/// </summary>
/// <param name="obj">The target element.</param>
/// <param name="value">The Style to attach.</param>
public static void SetTheme(AvaloniaObject obj, ControlTheme value)
{
obj.SetValue(ThemeProperty, value);
}
}

View File

@@ -0,0 +1,124 @@
using System;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using DownKyi.PrismExtension.Common;
using Prism.Ioc;
using Prism.Services.Dialogs;
namespace DownKyi.PrismExtension.Dialog;
public class DialogService : Prism.Services.Dialogs.DialogService, IDialogService
{
private readonly IContainerExtension _containerExtension;
/// <summary>Initializes a new instance of the <see cref="DialogService"/> class.</summary>
/// <param name="containerExtension">The <see cref="IContainerExtension" /></param>
public DialogService(IContainerExtension containerExtension) : base(containerExtension)
{
_containerExtension = containerExtension;
}
public Task ShowDialogAsync(string name, IDialogParameters parameters, Action<IDialogResult>? callback = null,
string? windowName = null)
{
return ShowDialogInternal(name, parameters, callback, true, windowName);
}
private Task ShowDialogInternal(string name, IDialogParameters parameters, Action<IDialogResult>? callback,
bool isModal, string? windowName = null, Window? parentWindow = null)
{
if (parameters == null)
parameters = new DialogParameters();
IDialogWindow dialogWindow = CreateDialogWindow(windowName);
ConfigureDialogWindowEvents(dialogWindow, callback);
ConfigureDialogWindowContent(name, dialogWindow, parameters);
return ShowDialogWindow(dialogWindow, isModal, parentWindow);
}
protected virtual IDialogWindow CreateDialogWindow(string name)
{
if (string.IsNullOrWhiteSpace(name))
return _containerExtension.Resolve<IDialogWindow>();
else
return _containerExtension.Resolve<IDialogWindow>(name);
}
protected new virtual Task ShowDialogWindow(IDialogWindow dialogWindow, bool isModal, Window? owner = null)
{
if (isModal &&
Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime deskLifetime)
{
// Ref:
// - https://docs.avaloniaui.net/docs/controls/window#show-a-window-as-a-dialog
// - https://github.com/AvaloniaUI/Avalonia/discussions/7924
// (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
if (owner != null)
return dialogWindow.ShowDialog(owner);
else
return dialogWindow.ShowDialog(deskLifetime.MainWindow);
}
else
{
dialogWindow.Show();
}
return Task.CompletedTask;
}
/// <summary>
/// Configure <see cref="IDialogWindow"/> content.
/// </summary>
/// <param name="dialogName">The name of the dialog to show.</param>
/// <param name="window">The hosting window.</param>
/// <param name="parameters">The parameters to pass to the dialog.</param>
protected virtual void ConfigureDialogWindowContent(string dialogName, IDialogWindow window,
IDialogParameters parameters)
{
var content = _containerExtension.Resolve<object>(dialogName);
if (!(content is Control dialogContent))
throw new NullReferenceException("A dialog's content must be a FrameworkElement");
MvvmHelpers.AutowireViewModel(dialogContent);
if (!(dialogContent.DataContext is IDialogAware viewModel))
throw new NullReferenceException("A dialog's ViewModel must implement the IDialogAware interface");
ConfigureDialogWindowProperties(window, dialogContent, viewModel);
MvvmHelpers.ViewAndViewModelAction<IDialogAware>(viewModel, d => d.OnDialogOpened(parameters));
}
protected void ConfigureDialogWindowProperties(IDialogWindow window, Control dialogContent,
IDialogAware viewModel)
{
// Avalonia returns 'null' for Dialog.GetWindowStyle(dialogContent);
// WPF: Window > ContentControl > FrameworkElement
// Ava: Window > WindowBase > TopLevel > Control > InputElement > Interactive > Layoutable > Visual > StyledElement.Styles (collection)
var windowTheme = Dialog.GetTheme(dialogContent);
if (windowTheme != null)
{
window.Theme = windowTheme;
}
window.Content = dialogContent;
window.DataContext = viewModel;
// WPF
//// var windowStyle = Dialog.GetWindowStyle(dialogContent);
//// if (windowStyle != null)
//// window.Style = windowStyle;
////
//// window.Content = dialogContent;
//// window.DataContext = viewModel; //we want the host window and the dialog to share the same data context
////
//// if (window.Owner == null)
// window.Owner = Application.Current?.Windows.OfType<Window>().FirstOrDefault(x => x.IsActive);
}
}

View File

@@ -0,0 +1,12 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:CompileBindings="False"
x:Class="DownKyi.PrismExtension.Dialog.DialogWindow"
Title="{Binding Title}"
WindowStartupLocation="CenterOwner">
<Window.Styles>
<Style Selector="Window">
<Setter Property="SizeToContent" Value="WidthAndHeight" />
</Style>
</Window.Styles>
</Window>

View File

@@ -0,0 +1,14 @@
using Avalonia.Controls;
using Prism.Services.Dialogs;
namespace DownKyi.PrismExtension.Dialog;
public partial class DialogWindow : Window, IDialogWindow
{
public DialogWindow()
{
InitializeComponent();
}
public IDialogResult? Result { get; set; }
}

View File

@@ -2,7 +2,7 @@ using System;
using System.Threading.Tasks;
using Prism.Services.Dialogs;
namespace DownKyi.Services;
namespace DownKyi.PrismExtension.Dialog;
public interface IDialogService : Prism.Services.Dialogs.IDialogService
{

View File

@@ -0,0 +1,8 @@
using Avalonia.Styling;
namespace DownKyi.PrismExtension.Dialog;
public interface IDialogWindow: Prism.Services.Dialogs.IDialogWindow
{
ControlTheme? Theme { get; set; }
}

View File

@@ -3,6 +3,7 @@ using DownKyi.Images;
using DownKyi.Utils;
using DownKyi.ViewModels.Dialogs;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.Services;

View File

@@ -1,58 +0,0 @@
using System;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Prism.Ioc;
using Prism.Services.Dialogs;
namespace DownKyi.Services;
public class DialogService : Prism.Services.Dialogs.DialogService, IDialogService
{
public DialogService(IContainerExtension containerExtension) : base(containerExtension)
{
}
public Task ShowDialogAsync(string name, IDialogParameters parameters, Action<IDialogResult>? callback = null,
string? windowName = null)
{
return ShowDialogInternal(name, parameters, callback, true, windowName);
}
private Task ShowDialogInternal(string name, IDialogParameters parameters, Action<IDialogResult>? callback,
bool isModal, string? windowName = null, Window? parentWindow = null)
{
if (parameters == null)
parameters = new DialogParameters();
IDialogWindow dialogWindow = CreateDialogWindow(windowName);
ConfigureDialogWindowEvents(dialogWindow, callback);
ConfigureDialogWindowContent(name, dialogWindow, parameters);
return ShowDialogWindow(dialogWindow, isModal, parentWindow);
}
protected new virtual Task ShowDialogWindow(IDialogWindow dialogWindow, bool isModal, Window? owner = null)
{
if (isModal &&
Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime deskLifetime)
{
// Ref:
// - https://docs.avaloniaui.net/docs/controls/window#show-a-window-as-a-dialog
// - https://github.com/AvaloniaUI/Avalonia/discussions/7924
// (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
if (owner != null)
return dialogWindow.ShowDialog(owner);
else
return dialogWindow.ShowDialog(deskLifetime.MainWindow);
}
else
{
dialogWindow.Show();
}
return Task.CompletedTask;
}
}

View File

@@ -20,6 +20,7 @@ using DownKyi.ViewModels.DownloadManager;
using DownKyi.ViewModels.PageViewModels;
using Prism.Events;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.Services.Download;

View File

@@ -15,9 +15,9 @@ using DownKyi.Core.Settings;
using DownKyi.Core.Utils;
using DownKyi.Images;
using DownKyi.Models;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Utils;
using DownKyi.ViewModels.DownloadManager;
using Prism.Services.Dialogs;
namespace DownKyi.Services.Download;

View File

@@ -14,7 +14,7 @@ using DownKyi.Core.Utils;
using DownKyi.Models;
using DownKyi.Utils;
using DownKyi.ViewModels.DownloadManager;
using Prism.Services.Dialogs;
using DownKyi.PrismExtension.Dialog;
using Console = DownKyi.Core.Utils.Debugging.Console;
namespace DownKyi.Services.Download;

View File

@@ -15,7 +15,7 @@ using DownKyi.Core.Utils;
using DownKyi.Models;
using DownKyi.Utils;
using DownKyi.ViewModels.DownloadManager;
using Prism.Services.Dialogs;
using DownKyi.PrismExtension.Dialog;
namespace DownKyi.Services.Download;

View File

@@ -16,6 +16,7 @@ using DownKyi.Core.Storage;
using DownKyi.Core.Utils;
using DownKyi.Images;
using DownKyi.Models;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Utils;
using DownKyi.ViewModels.DownloadManager;
using Console = DownKyi.Core.Utils.Debugging.Console;

View File

@@ -0,0 +1,60 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ControlTheme x:Key="SystemBtnStyle" TargetType="{x:Type Button}">
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="{x:Null}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter
Name="content"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style Selector="^:pointerover">
<Setter Property="Background" Value="{DynamicResource BrushSystemBtnHover}" />
</Style>
<Style Selector="^:pressed">
<Setter Property="Background" Value="{DynamicResource BrushSystemBtnPressed}" />
</Style>
</ControlTheme>
<ControlTheme
x:Key="CloseBtnStyle"
BasedOn="{StaticResource SystemBtnStyle}"
TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter
Name="content"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style Selector="^:pointerover">
<Setter Property="Background" Value="{DynamicResource BrushCloseBtnHover}" />
</Style>
<Style Selector="^:pressed">
<Setter Property="Background" Value="{DynamicResource BrushCloseBtnPressed}" />
</Style>
</ControlTheme>
</ResourceDictionary>

View File

@@ -7,7 +7,7 @@
<ResourceInclude Source="/Themes/Colors/ColorDefault.axaml" />
<ResourceInclude Source="/Themes/Styles/StyleBtn.axaml" />
<ResourceInclude Source="/Themes/Styles/StyleImageBtn.axaml" />
<!-- <ResourceInclude Source="Styles/StyleSystemBtn.xaml" /> -->
<ResourceInclude Source="/Themes/Styles/StyleSystemBtn.axaml" />
<ResourceInclude Source="/Themes/Styles/StyleCheckBox.axaml" />
<ResourceInclude Source="/Themes/Styles/StyleListBox.axaml" />
<!-- <ResourceInclude Source="Styles/StyleListView.xaml" /> -->

View File

@@ -2,7 +2,7 @@
using DownKyi.Core.BiliApi.BiliUtils;
using DownKyi.Core.BiliApi.Zone;
using DownKyi.Models;
using DownKyi.Services;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Utils;
using Prism.Mvvm;

View File

@@ -6,7 +6,7 @@ using DownKyi.Services;
using DownKyi.Utils;
using Prism.Commands;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.ViewModels.DownloadManager
{

View File

@@ -5,7 +5,7 @@ using DownKyi.Services;
using DownKyi.Utils;
using Prism.Commands;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.ViewModels.DownloadManager
{

View File

@@ -13,7 +13,7 @@ using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using Console = DownKyi.Core.Utils.Debugging.Console;
using IDialogService = DownKyi.Services.IDialogService;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.ViewModels.DownloadManager
{

View File

@@ -1,4 +1,10 @@
using DownKyi.Core.Logging;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;
using DownKyi.Core.Logging;
using DownKyi.Images;
using DownKyi.Models;
using DownKyi.Services;
@@ -7,13 +13,8 @@ using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;
using IDialogService = DownKyi.Services.IDialogService;
using Console = DownKyi.Core.Utils.Debugging.Console;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.ViewModels.DownloadManager
{
@@ -199,7 +200,7 @@ namespace DownKyi.ViewModels.DownloadManager
}
catch (Exception e)
{
Core.Utils.Debugging.Console.PrintLine("SetDialogService()发生异常: {0}", e);
Console.PrintLine("SetDialogService()发生异常: {0}", e);
LogManager.Error($"{Tag}.SetDialogService()", e);
}
}

View File

@@ -1,7 +1,7 @@
using DownKyi.Core.Settings;
using DownKyi.Events;
using DownKyi.Models;
using DownKyi.Services;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Utils;
using Prism.Commands;
using Prism.Events;

View File

@@ -11,7 +11,7 @@ using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.ViewModels.Settings;

View File

@@ -1,6 +1,6 @@
using System;
using Avalonia.Threading;
using DownKyi.Services;
using DownKyi.PrismExtension.Dialog;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;

View File

@@ -19,8 +19,7 @@ using DownKyi.ViewModels.PageViewModels;
using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.ViewModels;

View File

@@ -10,6 +10,7 @@ using DownKyi.Core.BiliApi.VideoStream;
using DownKyi.CustomControl;
using DownKyi.Events;
using DownKyi.Images;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Services;
using DownKyi.Services.Download;
using DownKyi.Utils;
@@ -17,8 +18,6 @@ using DownKyi.ViewModels.PageViewModels;
using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
namespace DownKyi.ViewModels;

View File

@@ -11,6 +11,7 @@ using DownKyi.Core.Storage;
using DownKyi.Core.Utils;
using DownKyi.Events;
using DownKyi.Images;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Services;
using DownKyi.Services.Download;
using DownKyi.Utils;
@@ -18,8 +19,6 @@ using DownKyi.ViewModels.PageViewModels;
using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
namespace DownKyi.ViewModels;

View File

@@ -10,6 +10,7 @@ using DownKyi.Core.BiliApi.VideoStream;
using DownKyi.Core.Storage;
using DownKyi.Events;
using DownKyi.Images;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Services;
using DownKyi.Services.Download;
using DownKyi.Utils;
@@ -17,8 +18,6 @@ using DownKyi.ViewModels.PageViewModels;
using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
namespace DownKyi.ViewModels;

View File

@@ -9,6 +9,7 @@ using DownKyi.Core.BiliApi.VideoStream;
using DownKyi.Core.Logging;
using DownKyi.Events;
using DownKyi.Images;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Services;
using DownKyi.Services.Download;
using DownKyi.Utils;
@@ -16,8 +17,6 @@ using DownKyi.ViewModels.PageViewModels;
using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
namespace DownKyi.ViewModels;

View File

@@ -12,6 +12,7 @@ using DownKyi.Core.Utils;
using DownKyi.CustomControl;
using DownKyi.Events;
using DownKyi.Images;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Services;
using DownKyi.Services.Download;
using DownKyi.Utils;

View File

@@ -12,6 +12,7 @@ using DownKyi.Core.Utils;
using DownKyi.CustomControl;
using DownKyi.Events;
using DownKyi.Images;
using DownKyi.PrismExtension.Dialog;
using DownKyi.Services;
using DownKyi.Services.Download;
using DownKyi.Utils;
@@ -19,8 +20,6 @@ using DownKyi.ViewModels.PageViewModels;
using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using IDialogService = DownKyi.Services.IDialogService;
namespace DownKyi.ViewModels;

View File

@@ -22,7 +22,7 @@ using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using Console = DownKyi.Core.Utils.Debugging.Console;
using IDialogService = DownKyi.Services.IDialogService;
using IDialogService = DownKyi.PrismExtension.Dialog.IDialogService;
namespace DownKyi.ViewModels;

View File

@@ -4,7 +4,20 @@
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
xmlns:vmd="clr-namespace:DownKyi.ViewModels.Dialogs"
x:DataType="vmd:ViewAlertDialogViewModel">
xmlns:prismExtension="clr-namespace:DownKyi.PrismExtension.Dialog"
x:DataType="vmd:ViewAlertDialogViewModel"
xmlns:i="using:Avalonia.Xaml.Interactivity"
xmlns:ia="clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions">
<prismExtension:Dialog.Theme>
<ControlTheme TargetType="Window">
<Setter Property="CanResize" Value="False" />
<Setter Property="ShowInTaskbar" Value="False" />
<Setter Property="SizeToContent" Value="WidthAndHeight" />
<Setter Property="SystemDecorations" Value="None" />
</ControlTheme>
</prismExtension:Dialog.Theme>
<Border BorderBrush="{DynamicResource BrushWindowBorder}" BorderThickness="1,1,0.6,0.6">
<Grid Background="{DynamicResource BrushBackground}" RowDefinitions="40,*">
@@ -18,7 +31,9 @@
Margin="10,0"
VerticalAlignment="Center"
Orientation="Horizontal">
<ContentControl Margin="0,0,10,0">
<ContentControl
Margin="0,0,10,0"
IsVisible="{Binding Image,Converter={x:Static ObjectConverters.IsNotNull}}">
<Path
Width="{Binding Image.Width}"
Height="{Binding Image.Height}"
@@ -34,12 +49,14 @@
</StackPanel>
<Button
Grid.Column="4"
Command="{Binding CloseCommand}">
Command="{Binding CloseCommand}"
ToolTip.Tip="{DynamicResource Close}"
Theme="{StaticResource CloseBtnStyle}">
<Path
Width="{Binding CloseIcon.Width}"
Height="{Binding CloseIcon.Height}"
Data="{Binding CloseIcon.Data}"
Fill="{Binding CloseIcon.Fill}"
Fill="{DynamicResource ColorSystemBtnTintDark}"
Stretch="UniformToFill" />
</Button>
</Grid>

View File

@@ -1,10 +1,17 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="DownKyi.Views.Dialogs.ViewDownloadSetter"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
xmlns:vmd="clr-namespace:DownKyi.ViewModels.Dialogs"
xmlns:prismExtension="clr-namespace:DownKyi.PrismExtension.Dialog"
x:DataType="vmd:ViewDownloadSetterViewModel">
<prismExtension:Dialog.Theme>
<ControlTheme TargetType="Window">
<Setter Property="CanResize" Value="False" />
<Setter Property="ShowInTaskbar" Value="False" />
<Setter Property="SizeToContent" Value="WidthAndHeight" />
<Setter Property="SystemDecorations" Value="None" />
</ControlTheme>
</prismExtension:Dialog.Theme>
<Border BorderBrush="{DynamicResource BrushWindowBorder}" BorderThickness="1,1,1,0.6">
<Grid Background="{DynamicResource BrushBackground}" RowDefinitions="40,*">

View File

@@ -4,24 +4,45 @@
prism:ViewModelLocator.AutoWireViewModel="True"
x:Class="DownKyi.Views.Dialogs.ViewParsingSelector"
xmlns:vmd="clr-namespace:DownKyi.ViewModels.Dialogs"
xmlns:prismExtension="clr-namespace:DownKyi.PrismExtension.Dialog"
x:DataType="vmd:ViewParsingSelectorViewModel">
<!--<prism:Dialog.WindowStyle>
<Style Selector="Window">
<Setter Property="prism:Dialog.WindowStartupLocation" Value="CenterOwner" />
<prismExtension:Dialog.Theme>
<ControlTheme TargetType="Window">
<Setter Property="CanResize" Value="False" />
<Setter Property="ShowInTaskbar" Value="False" />
<Setter Property="SizeToContent" Value="WidthAndHeight" />
~1~ <Setter Property="WindowStyle" Value="None" /> @1@
</Style>
</prism:Dialog.WindowStyle>-->
<Setter Property="SystemDecorations" Value="None" />
</ControlTheme>
</prismExtension:Dialog.Theme>
<Border BorderBrush="{DynamicResource BrushWindowBorder}" BorderThickness="1,1,1,0.6">
<Grid Background="{DynamicResource BrushBackground}" RowDefinitions="40,*">
<Grid
Grid.Row="0"
Background="{DynamicResource BrushBackgroundGreyTranslucent3}">
<Grid
Grid.Row="0"
Background="{DynamicResource BrushBackgroundGreyTranslucent3}" ColumnDefinitions="*,50,*,50">
<TextBlock
Grid.Column="0"
Margin="10,0"
VerticalAlignment="Center"
FontSize="12"
Foreground="{DynamicResource BrushCaptionForeground}"
Text="{Binding Title}" />
<Button
Grid.Column="4"
Command="{Binding CloseCommand}"
Theme="{StaticResource CloseBtnStyle}"
ToolTip.Tip="{DynamicResource Close}">
<Path
Width="{Binding CloseIcon.Width}"
Height="{Binding CloseIcon.Height}"
Data="{Binding CloseIcon.Data}"
Fill="{Binding CloseIcon.Fill}"
Stretch="UniformToFill" />
</Button>
</Grid>
<StackPanel