feat: respect close button visibility in all options.
This commit is contained in:
@@ -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);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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; }
|
||||||
|
|||||||
Reference in New Issue
Block a user