feat: respect close button visibility in all options.

This commit is contained in:
rabbitism
2024-08-25 15:14:55 +08:00
parent 271fcbb631
commit f5726dbafc
7 changed files with 197 additions and 241 deletions

View File

@@ -3,28 +3,19 @@ using Irihi.Avalonia.Shared.Contracts;
namespace Ursa.Controls; namespace Ursa.Controls;
public class CustomDialogControl: DialogControlBase public class CustomDialogControl : DialogControlBase
{ {
internal bool IsCloseButtonVisible { get; set; }
protected override void OnApplyTemplate(TemplateAppliedEventArgs e) protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{ {
base.OnApplyTemplate(e); base.OnApplyTemplate(e);
if (_closeButton is not null) if (_closeButton is not null) _closeButton.IsVisible = IsCloseButtonVisible ?? true;
{
_closeButton.IsVisible = IsCloseButtonVisible;
}
} }
public override void Close() public override void Close()
{ {
if (DataContext is IDialogContext context) if (DataContext is IDialogContext context)
{
context.Close(); context.Close();
}
else else
{
OnElementClosing(this, null); OnElementClosing(this, null);
}
} }
} }

View File

@@ -12,20 +12,30 @@ namespace Ursa.Controls;
[TemplatePart(PART_CancelButton, typeof(Button))] [TemplatePart(PART_CancelButton, typeof(Button))]
[TemplatePart(PART_YesButton, typeof(Button))] [TemplatePart(PART_YesButton, typeof(Button))]
[TemplatePart(PART_NoButton, typeof(Button))] [TemplatePart(PART_NoButton, typeof(Button))]
public class DefaultDialogControl: DialogControlBase public class DefaultDialogControl : DialogControlBase
{ {
public const string PART_OKButton = "PART_OKButton"; public const string PART_OKButton = "PART_OKButton";
public const string PART_CancelButton = "PART_CancelButton"; public const string PART_CancelButton = "PART_CancelButton";
public const string PART_YesButton = "PART_YesButton"; public const string PART_YesButton = "PART_YesButton";
public const string PART_NoButton = "PART_NoButton"; public const string PART_NoButton = "PART_NoButton";
private Button? _okButton; public static readonly StyledProperty<string?> TitleProperty =
AvaloniaProperty.Register<DefaultDialogControl, string?>(
nameof(Title));
public static readonly StyledProperty<DialogButton> ButtonsProperty =
AvaloniaProperty.Register<DefaultDialogControl, DialogButton>(
nameof(Buttons));
public static readonly StyledProperty<DialogMode> ModeProperty =
AvaloniaProperty.Register<DefaultDialogControl, DialogMode>(
nameof(Mode));
private Button? _cancelButton; private Button? _cancelButton;
private Button? _yesButton;
private Button? _noButton; private Button? _noButton;
public static readonly StyledProperty<string?> TitleProperty = AvaloniaProperty.Register<DefaultDialogControl, string?>( private Button? _okButton;
nameof(Title)); private Button? _yesButton;
public string? Title public string? Title
{ {
@@ -33,24 +43,18 @@ public class DefaultDialogControl: DialogControlBase
set => SetValue(TitleProperty, value); set => SetValue(TitleProperty, value);
} }
public static readonly StyledProperty<DialogButton> ButtonsProperty = AvaloniaProperty.Register<DefaultDialogControl, DialogButton>(
nameof(Buttons));
public DialogButton Buttons public DialogButton Buttons
{ {
get => GetValue(ButtonsProperty); get => GetValue(ButtonsProperty);
set => SetValue(ButtonsProperty, value); set => SetValue(ButtonsProperty, value);
} }
public static readonly StyledProperty<DialogMode> ModeProperty = AvaloniaProperty.Register<DefaultDialogControl, DialogMode>(
nameof(Mode));
public DialogMode Mode public DialogMode Mode
{ {
get => GetValue(ModeProperty); get => GetValue(ModeProperty);
set => SetValue(ModeProperty, value); set => SetValue(ModeProperty, value);
} }
protected override void OnApplyTemplate(TemplateAppliedEventArgs e) protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{ {
base.OnApplyTemplate(e); base.OnApplyTemplate(e);
@@ -62,56 +66,48 @@ public class DefaultDialogControl: DialogControlBase
Button.ClickEvent.AddHandler(DefaultButtonsClose, _okButton, _cancelButton, _yesButton, _noButton); Button.ClickEvent.AddHandler(DefaultButtonsClose, _okButton, _cancelButton, _yesButton, _noButton);
SetButtonVisibility(); SetButtonVisibility();
} }
private void SetButtonVisibility() private void SetButtonVisibility()
{ {
bool isCloseButtonVisible = DataContext is IDialogContext || Buttons != DialogButton.YesNo; var isCloseButtonVisible =
Button.IsVisibleProperty.SetValue(isCloseButtonVisible, _closeButton); IsCloseButtonVisible ?? (DataContext is IDialogContext || Buttons != DialogButton.YesNo);
IsVisibleProperty.SetValue(isCloseButtonVisible, _closeButton);
switch (Buttons) switch (Buttons)
{ {
case DialogButton.None: case DialogButton.None:
Button.IsVisibleProperty.SetValue(false, _okButton, _cancelButton, _yesButton, _noButton); IsVisibleProperty.SetValue(false, _okButton, _cancelButton, _yesButton, _noButton);
break; break;
case DialogButton.OK: case DialogButton.OK:
Button.IsVisibleProperty.SetValue(true, _okButton); IsVisibleProperty.SetValue(true, _okButton);
Button.IsVisibleProperty.SetValue(false, _cancelButton, _yesButton, _noButton); IsVisibleProperty.SetValue(false, _cancelButton, _yesButton, _noButton);
break; break;
case DialogButton.OKCancel: case DialogButton.OKCancel:
Button.IsVisibleProperty.SetValue(true, _okButton, _cancelButton); IsVisibleProperty.SetValue(true, _okButton, _cancelButton);
Button.IsVisibleProperty.SetValue(false, _yesButton, _noButton); IsVisibleProperty.SetValue(false, _yesButton, _noButton);
break; break;
case DialogButton.YesNo: case DialogButton.YesNo:
Button.IsVisibleProperty.SetValue(false, _okButton, _cancelButton); IsVisibleProperty.SetValue(false, _okButton, _cancelButton);
Button.IsVisibleProperty.SetValue(true, _yesButton, _noButton); IsVisibleProperty.SetValue(true, _yesButton, _noButton);
break; break;
case DialogButton.YesNoCancel: case DialogButton.YesNoCancel:
Button.IsVisibleProperty.SetValue(false, _okButton); IsVisibleProperty.SetValue(false, _okButton);
Button.IsVisibleProperty.SetValue(true, _cancelButton, _yesButton, _noButton); IsVisibleProperty.SetValue(true, _cancelButton, _yesButton, _noButton);
break; break;
} }
} }
private void DefaultButtonsClose(object? sender, RoutedEventArgs args) private void DefaultButtonsClose(object? sender, RoutedEventArgs args)
{ {
if (sender is Button button) if (sender is Button button)
{ {
if (button == _okButton) if (button == _okButton)
{
OnElementClosing(this, DialogResult.OK); OnElementClosing(this, DialogResult.OK);
}
else if (button == _cancelButton) else if (button == _cancelButton)
{
OnElementClosing(this, DialogResult.Cancel); OnElementClosing(this, DialogResult.Cancel);
}
else if (button == _yesButton) else if (button == _yesButton)
{
OnElementClosing(this, DialogResult.Yes); OnElementClosing(this, DialogResult.Yes);
} else if (button == _noButton) OnElementClosing(this, DialogResult.No);
else if (button == _noButton)
{
OnElementClosing(this, DialogResult.No);
}
} }
} }
@@ -123,7 +119,7 @@ public class DefaultDialogControl: DialogControlBase
} }
else else
{ {
DialogResult result = Buttons switch var result = Buttons switch
{ {
DialogButton.None => DialogResult.None, DialogButton.None => DialogResult.None,
DialogButton.OK => DialogResult.OK, DialogButton.OK => DialogResult.OK,

View File

@@ -12,22 +12,27 @@ namespace Ursa.Controls;
[TemplatePart(PART_NoButton, typeof(Button))] [TemplatePart(PART_NoButton, typeof(Button))]
[TemplatePart(PART_OKButton, typeof(Button))] [TemplatePart(PART_OKButton, typeof(Button))]
[TemplatePart(PART_CancelButton, typeof(Button))] [TemplatePart(PART_CancelButton, typeof(Button))]
public class DefaultDialogWindow: DialogWindow public class DefaultDialogWindow : DialogWindow
{ {
protected override Type StyleKeyOverride { get; } = typeof(DefaultDialogWindow);
public const string PART_YesButton = "PART_YesButton"; public const string PART_YesButton = "PART_YesButton";
public const string PART_NoButton = "PART_NoButton"; public const string PART_NoButton = "PART_NoButton";
public const string PART_OKButton = "PART_OKButton"; public const string PART_OKButton = "PART_OKButton";
public const string PART_CancelButton = "PART_CancelButton"; public const string PART_CancelButton = "PART_CancelButton";
private Button? _yesButton; public static readonly StyledProperty<DialogButton> ButtonsProperty =
AvaloniaProperty.Register<DefaultDialogWindow, DialogButton>(
nameof(Buttons));
public static readonly StyledProperty<DialogMode> ModeProperty =
AvaloniaProperty.Register<DefaultDialogWindow, DialogMode>(
nameof(Mode));
private Button? _cancelButton;
private Button? _noButton; private Button? _noButton;
private Button? _okButton; private Button? _okButton;
private Button? _cancelButton;
public static readonly StyledProperty<DialogButton> ButtonsProperty = AvaloniaProperty.Register<DefaultDialogWindow, DialogButton>( private Button? _yesButton;
nameof(Buttons)); protected override Type StyleKeyOverride { get; } = typeof(DefaultDialogWindow);
public DialogButton Buttons public DialogButton Buttons
{ {
@@ -35,15 +40,12 @@ public class DefaultDialogWindow: DialogWindow
set => SetValue(ButtonsProperty, value); set => SetValue(ButtonsProperty, value);
} }
public static readonly StyledProperty<DialogMode> ModeProperty = AvaloniaProperty.Register<DefaultDialogWindow, DialogMode>(
nameof(Mode));
public DialogMode Mode public DialogMode Mode
{ {
get => GetValue(ModeProperty); get => GetValue(ModeProperty);
set => SetValue(ModeProperty, value); set => SetValue(ModeProperty, value);
} }
protected override void OnApplyTemplate(TemplateAppliedEventArgs e) protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{ {
base.OnApplyTemplate(e); base.OnApplyTemplate(e);
@@ -59,69 +61,43 @@ public class DefaultDialogWindow: DialogWindow
private void OnDefaultClose(object? sender, RoutedEventArgs e) private void OnDefaultClose(object? sender, RoutedEventArgs e)
{ {
if (Equals(sender, _yesButton)) if (Equals(sender, _yesButton))
{
Close(DialogResult.Yes); Close(DialogResult.Yes);
return; else if (Equals(sender, _noButton))
}
if(Equals(sender, _noButton))
{
Close(DialogResult.No); Close(DialogResult.No);
return; else if (Equals(sender, _okButton))
}
if(Equals(sender, _okButton))
{
Close(DialogResult.OK); Close(DialogResult.OK);
return; else if (Equals(sender, _cancelButton))
}
if(Equals(sender, _cancelButton))
{
Close(DialogResult.Cancel); Close(DialogResult.Cancel);
}
} }
private void SetButtonVisibility() private void SetButtonVisibility()
{ {
bool closeButtonVisible = DataContext is IDialogContext || Buttons != DialogButton.YesNo; var closeButtonVisible =
SetVisibility(_closeButton, closeButtonVisible); IsCloseButtonVisible ?? (DataContext is IDialogContext || Buttons != DialogButton.YesNo);
IsVisibleProperty.SetValue(closeButtonVisible, _closeButton);
switch (Buttons) switch (Buttons)
{ {
case DialogButton.None: case DialogButton.None:
SetVisibility(_okButton, false); IsVisibleProperty.SetValue(false, _okButton, _cancelButton, _yesButton, _noButton);
SetVisibility(_cancelButton, false);
SetVisibility(_yesButton, false);
SetVisibility(_noButton, false);
break; break;
case DialogButton.OK: case DialogButton.OK:
SetVisibility(_okButton, true); IsVisibleProperty.SetValue(true, _okButton);
SetVisibility(_cancelButton, false); IsVisibleProperty.SetValue(false, _cancelButton, _yesButton, _noButton);
SetVisibility(_yesButton, false);
SetVisibility(_noButton, false);
break; break;
case DialogButton.OKCancel: case DialogButton.OKCancel:
SetVisibility(_okButton, true); IsVisibleProperty.SetValue(true, _okButton, _cancelButton);
SetVisibility(_cancelButton, true); IsVisibleProperty.SetValue(false, _yesButton, _noButton);
SetVisibility(_yesButton, false);
SetVisibility(_noButton, false);
break; break;
case DialogButton.YesNo: case DialogButton.YesNo:
SetVisibility(_okButton, false); IsVisibleProperty.SetValue(false, _okButton, _cancelButton);
SetVisibility(_cancelButton, false); IsVisibleProperty.SetValue(true, _yesButton, _noButton);
SetVisibility(_yesButton, true);
SetVisibility(_noButton, true);
break; break;
case DialogButton.YesNoCancel: case DialogButton.YesNoCancel:
SetVisibility(_okButton, false); IsVisibleProperty.SetValue(false, _okButton);
SetVisibility(_cancelButton, true); IsVisibleProperty.SetValue(true, _cancelButton, _yesButton, _noButton);
SetVisibility(_yesButton, true);
SetVisibility(_noButton, true);
break; break;
} }
} }
private void SetVisibility(Button? button, bool visible)
{
if (button is not null) button.IsVisible = visible;
}
protected override void OnCloseButtonClicked(object? sender, RoutedEventArgs args) protected override void OnCloseButtonClicked(object? sender, RoutedEventArgs args)
{ {
@@ -131,7 +107,7 @@ public class DefaultDialogWindow: DialogWindow
} }
else else
{ {
DialogResult result = Buttons switch var result = Buttons switch
{ {
DialogButton.None => DialogResult.None, DialogButton.None => DialogResult.None,
DialogButton.OK => DialogResult.OK, DialogButton.OK => DialogResult.OK,

View File

@@ -20,6 +20,22 @@ public abstract class DialogControlBase : OverlayFeedbackElement
public const string PC_Modal = ":modal"; public const string PC_Modal = ":modal";
public const string PC_FullScreen = ":full-screen"; public const string PC_FullScreen = ":full-screen";
public static readonly DirectProperty<DialogControlBase, bool> IsFullScreenProperty =
AvaloniaProperty.RegisterDirect<DialogControlBase, bool>(
nameof(IsFullScreen), o => o.IsFullScreen, (o, v) => o.IsFullScreen = v);
protected internal Button? _closeButton;
private bool _isFullScreen;
private Panel? _titleArea;
static DialogControlBase()
{
CanDragMoveProperty.Changed.AddClassHandler<InputElement, bool>(OnCanDragMoveChanged);
CanCloseProperty.Changed.AddClassHandler<InputElement, bool>(OnCanCloseChanged);
IsFullScreenProperty.AffectsPseudoClass<DialogControlBase>(PC_FullScreen);
}
internal HorizontalPosition HorizontalAnchor { get; set; } = HorizontalPosition.Center; internal HorizontalPosition HorizontalAnchor { get; set; } = HorizontalPosition.Center;
internal VerticalPosition VerticalAnchor { get; set; } = VerticalPosition.Center; internal VerticalPosition VerticalAnchor { get; set; } = VerticalPosition.Center;
internal HorizontalPosition ActualHorizontalAnchor { get; set; } internal HorizontalPosition ActualHorizontalAnchor { get; set; }
@@ -29,11 +45,7 @@ public abstract class DialogControlBase : OverlayFeedbackElement
internal double? HorizontalOffsetRatio { get; set; } internal double? HorizontalOffsetRatio { get; set; }
internal double? VerticalOffsetRatio { get; set; } internal double? VerticalOffsetRatio { get; set; }
internal bool CanLightDismiss { get; set; } internal bool CanLightDismiss { get; set; }
internal bool? IsCloseButtonVisible { get; set; }
private bool _isFullScreen;
public static readonly DirectProperty<DialogControlBase, bool> IsFullScreenProperty = AvaloniaProperty.RegisterDirect<DialogControlBase, bool>(
nameof(IsFullScreen), o => o.IsFullScreen, (o, v) => o.IsFullScreen = v);
public bool IsFullScreen public bool IsFullScreen
{ {
@@ -41,113 +53,6 @@ public abstract class DialogControlBase : OverlayFeedbackElement
set => SetAndRaise(IsFullScreenProperty, ref _isFullScreen, value); set => SetAndRaise(IsFullScreenProperty, ref _isFullScreen, value);
} }
protected internal Button? _closeButton;
private Panel? _titleArea;
#region Layer Management
public static readonly RoutedEvent<DialogLayerChangeEventArgs> LayerChangedEvent =
RoutedEvent.Register<CustomDialogControl, DialogLayerChangeEventArgs>(
nameof(LayerChanged), RoutingStrategies.Bubble);
public event EventHandler<DialogLayerChangeEventArgs> LayerChanged
{
add => AddHandler(LayerChangedEvent, value);
remove => RemoveHandler(LayerChangedEvent, value);
}
public void UpdateLayer(object? o)
{
if (o is DialogLayerChangeType t)
{
RaiseEvent(new DialogLayerChangeEventArgs(LayerChangedEvent, t));
}
}
#endregion
#region DragMove AttachedPropert
public static readonly AttachedProperty<bool> CanDragMoveProperty =
AvaloniaProperty.RegisterAttached<DialogControlBase, InputElement, bool>("CanDragMove");
public static void SetCanDragMove(InputElement obj, bool value) => obj.SetValue(CanDragMoveProperty, value);
public static bool GetCanDragMove(InputElement obj) => obj.GetValue(CanDragMoveProperty);
private static void OnCanDragMoveChanged(InputElement arg1, AvaloniaPropertyChangedEventArgs<bool> arg2)
{
if (arg2.NewValue.Value)
{
arg1.AddHandler(PointerPressedEvent, OnPointerPressed, RoutingStrategies.Bubble);
arg1.AddHandler(PointerMovedEvent, OnPointerMoved, RoutingStrategies.Bubble);
arg1.AddHandler(PointerReleasedEvent, OnPointerReleased, RoutingStrategies.Bubble);
}
else
{
arg1.RemoveHandler(PointerPressedEvent, OnPointerPressed);
arg1.RemoveHandler(PointerMovedEvent, OnPointerMoved);
arg1.RemoveHandler(PointerReleasedEvent, OnPointerReleased);
}
void OnPointerPressed(InputElement sender, PointerPressedEventArgs e)
{
if (sender.FindLogicalAncestorOfType<DialogControlBase>() is { } dialog)
{
e.Source = dialog;
}
}
void OnPointerMoved(InputElement sender, PointerEventArgs e)
{
if (sender.FindLogicalAncestorOfType<DialogControlBase>() is { } dialog)
{
e.Source = dialog;
}
}
void OnPointerReleased(InputElement sender, PointerReleasedEventArgs e)
{
if (sender.FindLogicalAncestorOfType<DialogControlBase>() is { } dialog)
{
e.Source = dialog;
}
}
}
#endregion
#region Close AttachedProperty
public static readonly AttachedProperty<bool> CanCloseProperty =
AvaloniaProperty.RegisterAttached<DialogControlBase, InputElement, bool>("CanClose");
public static void SetCanClose(InputElement obj, bool value) => obj.SetValue(CanCloseProperty, value);
public static bool GetCanClose(InputElement obj) => obj.GetValue(CanCloseProperty);
private static void OnCanCloseChanged(InputElement arg1, AvaloniaPropertyChangedEventArgs<bool> arg2)
{
if (arg2.NewValue.Value)
{
arg1.AddHandler(PointerPressedEvent, OnPointerPressed, RoutingStrategies.Bubble);
}
void OnPointerPressed(InputElement sender, PointerPressedEventArgs e)
{
if (sender.FindLogicalAncestorOfType<DialogControlBase>() is { } dialog)
{
dialog.Close();
}
}
}
#endregion
static DialogControlBase()
{
CanDragMoveProperty.Changed.AddClassHandler<InputElement, bool>(OnCanDragMoveChanged);
CanCloseProperty.Changed.AddClassHandler<InputElement, bool>(OnCanCloseChanged);
IsFullScreenProperty.AffectsPseudoClass<DialogControlBase>(PC_FullScreen);
}
protected override void OnApplyTemplate(TemplateAppliedEventArgs e) protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{ {
@@ -188,10 +93,107 @@ public abstract class DialogControlBase : OverlayFeedbackElement
e.Source = this; e.Source = this;
} }
private void OnCloseButtonClick(object? sender, RoutedEventArgs args) => Close(); private void OnCloseButtonClick(object? sender, RoutedEventArgs args)
{
Close();
}
internal void SetAsModal(bool modal) internal void SetAsModal(bool modal)
{ {
PseudoClasses.Set(PC_Modal, modal); PseudoClasses.Set(PC_Modal, modal);
} }
#region Layer Management
public static readonly RoutedEvent<DialogLayerChangeEventArgs> LayerChangedEvent =
RoutedEvent.Register<CustomDialogControl, DialogLayerChangeEventArgs>(
nameof(LayerChanged), RoutingStrategies.Bubble);
public event EventHandler<DialogLayerChangeEventArgs> LayerChanged
{
add => AddHandler(LayerChangedEvent, value);
remove => RemoveHandler(LayerChangedEvent, value);
}
public void UpdateLayer(object? o)
{
if (o is DialogLayerChangeType t) RaiseEvent(new DialogLayerChangeEventArgs(LayerChangedEvent, t));
}
#endregion
#region DragMove AttachedPropert
public static readonly AttachedProperty<bool> CanDragMoveProperty =
AvaloniaProperty.RegisterAttached<DialogControlBase, InputElement, bool>("CanDragMove");
public static void SetCanDragMove(InputElement obj, bool value)
{
obj.SetValue(CanDragMoveProperty, value);
}
public static bool GetCanDragMove(InputElement obj)
{
return obj.GetValue(CanDragMoveProperty);
}
private static void OnCanDragMoveChanged(InputElement arg1, AvaloniaPropertyChangedEventArgs<bool> arg2)
{
if (arg2.NewValue.Value)
{
arg1.AddHandler(PointerPressedEvent, OnPointerPressed, RoutingStrategies.Bubble);
arg1.AddHandler(PointerMovedEvent, OnPointerMoved, RoutingStrategies.Bubble);
arg1.AddHandler(PointerReleasedEvent, OnPointerReleased, RoutingStrategies.Bubble);
}
else
{
arg1.RemoveHandler(PointerPressedEvent, OnPointerPressed);
arg1.RemoveHandler(PointerMovedEvent, OnPointerMoved);
arg1.RemoveHandler(PointerReleasedEvent, OnPointerReleased);
}
void OnPointerPressed(InputElement sender, PointerPressedEventArgs e)
{
if (sender.FindLogicalAncestorOfType<DialogControlBase>() is { } dialog) e.Source = dialog;
}
void OnPointerMoved(InputElement sender, PointerEventArgs e)
{
if (sender.FindLogicalAncestorOfType<DialogControlBase>() is { } dialog) e.Source = dialog;
}
void OnPointerReleased(InputElement sender, PointerReleasedEventArgs e)
{
if (sender.FindLogicalAncestorOfType<DialogControlBase>() is { } dialog) e.Source = dialog;
}
}
#endregion
#region Close AttachedProperty
public static readonly AttachedProperty<bool> CanCloseProperty =
AvaloniaProperty.RegisterAttached<DialogControlBase, InputElement, bool>("CanClose");
public static void SetCanClose(InputElement obj, bool value)
{
obj.SetValue(CanCloseProperty, value);
}
public static bool GetCanClose(InputElement obj)
{
return obj.GetValue(CanCloseProperty);
}
private static void OnCanCloseChanged(InputElement arg1, AvaloniaPropertyChangedEventArgs<bool> arg2)
{
if (arg2.NewValue.Value) arg1.AddHandler(PointerPressedEvent, OnPointerPressed, RoutingStrategies.Bubble);
void OnPointerPressed(InputElement sender, PointerPressedEventArgs e)
{
if (sender.FindLogicalAncestorOfType<DialogControlBase>() is { } dialog) dialog.Close();
}
}
#endregion
} }

View File

@@ -11,33 +11,29 @@ namespace Ursa.Controls;
[TemplatePart(PART_CloseButton, typeof(Button))] [TemplatePart(PART_CloseButton, typeof(Button))]
[TemplatePart(PART_TitleArea, typeof(Panel))] [TemplatePart(PART_TitleArea, typeof(Panel))]
public class DialogWindow: Window public class DialogWindow : Window
{ {
public const string PART_CloseButton = "PART_CloseButton"; public const string PART_CloseButton = "PART_CloseButton";
public const string PART_TitleArea = "PART_TitleArea"; public const string PART_TitleArea = "PART_TitleArea";
protected override Type StyleKeyOverride { get; } = typeof(DialogWindow);
protected internal Button? _closeButton; protected internal Button? _closeButton;
private Panel? _titleArea; private Panel? _titleArea;
internal bool IsCloseButtonVisible { get; set; }
static DialogWindow() static DialogWindow()
{ {
DataContextProperty.Changed.AddClassHandler<DialogWindow, object?>((o, e) => o.OnDataContextChange(e)); DataContextProperty.Changed.AddClassHandler<DialogWindow, object?>((window, e) =>
window.OnDataContextChange(e));
} }
protected override Type StyleKeyOverride { get; } = typeof(DialogWindow);
internal bool? IsCloseButtonVisible { get; set; }
private void OnDataContextChange(AvaloniaPropertyChangedEventArgs<object?> args) private void OnDataContextChange(AvaloniaPropertyChangedEventArgs<object?> args)
{ {
if (args.OldValue.Value is IDialogContext oldContext) if (args.OldValue.Value is IDialogContext oldContext) oldContext.RequestClose -= OnContextRequestClose;
{
oldContext.RequestClose-= OnContextRequestClose;
}
if (args.NewValue.Value is IDialogContext newContext) if (args.NewValue.Value is IDialogContext newContext) newContext.RequestClose += OnContextRequestClose;
{
newContext.RequestClose += OnContextRequestClose;
}
} }
protected override void OnApplyTemplate(TemplateAppliedEventArgs e) protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
@@ -46,11 +42,10 @@ public class DialogWindow: Window
Button.ClickEvent.RemoveHandler(OnCloseButtonClicked, _closeButton); Button.ClickEvent.RemoveHandler(OnCloseButtonClicked, _closeButton);
_titleArea?.RemoveHandler(PointerPressedEvent, OnTitlePointerPressed); _titleArea?.RemoveHandler(PointerPressedEvent, OnTitlePointerPressed);
_closeButton = e.NameScope.Find<Button>(PART_CloseButton); _closeButton = e.NameScope.Find<Button>(PART_CloseButton);
Button.IsVisibleProperty.SetValue(IsCloseButtonVisible, _closeButton); IsVisibleProperty.SetValue(IsCloseButtonVisible ?? true, _closeButton);
Button.ClickEvent.AddHandler(OnCloseButtonClicked, _closeButton); Button.ClickEvent.AddHandler(OnCloseButtonClicked, _closeButton);
_titleArea = e.NameScope.Find<Panel>(PART_TitleArea); _titleArea = e.NameScope.Find<Panel>(PART_TitleArea);
_titleArea?.AddHandler(PointerPressedEvent, OnTitlePointerPressed, RoutingStrategies.Bubble); _titleArea?.AddHandler(PointerPressedEvent, OnTitlePointerPressed, RoutingStrategies.Bubble);
} }
private void OnContextRequestClose(object? sender, object? args) private void OnContextRequestClose(object? sender, object? args)
@@ -61,17 +56,13 @@ public class DialogWindow: Window
protected virtual void OnCloseButtonClicked(object? sender, RoutedEventArgs args) protected virtual void OnCloseButtonClicked(object? sender, RoutedEventArgs args)
{ {
if (DataContext is IDialogContext context) if (DataContext is IDialogContext context)
{
context.Close(); context.Close();
}
else else
{
Close(null); Close(null);
}
} }
private void OnTitlePointerPressed(object? sender, PointerPressedEventArgs e) private void OnTitlePointerPressed(object? sender, PointerPressedEventArgs e)
{ {
this.BeginMoveDrag(e); BeginMoveDrag(e);
} }
} }

View File

@@ -25,7 +25,7 @@ public class DialogOptions
public DialogButton Button { get; set; } = DialogButton.OKCancel; public DialogButton Button { get; set; } = DialogButton.OKCancel;
public bool IsCloseButtonVisible { get; set; } = true; public bool? IsCloseButtonVisible { get; set; } = true;
public bool ShowInTaskBar { get; set; } = true; public bool ShowInTaskBar { get; set; } = true;
} }

View File

@@ -43,7 +43,7 @@ public class OverlayDialogOptions
/// <summary> /// <summary>
/// Only works for CustomDialogControl /// Only works for CustomDialogControl
/// </summary> /// </summary>
public bool IsCloseButtonVisible { get; set; } = true; public bool? IsCloseButtonVisible { get; set; } = true;
[Obsolete()] [Obsolete()]
public bool ShowCloseButton { get; set; } = true; public bool ShowCloseButton { get; set; } = true;
public bool CanLightDismiss { get; set; } public bool CanLightDismiss { get; set; }