123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- using System;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Input;
- using System.Windows.Media;
- using HandyControl.Data;
- using HandyControl.Interactivity;
- using HandyControl.Tools;
- namespace HandyControl.Controls;
- /// <summary>
- /// 弹出窗口
- /// </summary>
- [TemplatePart(Name = ElementMainBorder, Type = typeof(Border))]
- [TemplatePart(Name = ElementTitleBlock, Type = typeof(TextBlock))]
- public class PopupWindow : System.Windows.Window
- {
- #region Constants
- private const string ElementMainBorder = "PART_MainBorder";
- private const string ElementTitleBlock = "PART_TitleBlock";
- #endregion Constants
- private Border _mainBorder;
- private TextBlock _titleBlock;
- private bool _showBackground = true;
- private FrameworkElement _targetElement;
- public override void OnApplyTemplate()
- {
- if (_titleBlock != null)
- {
- _titleBlock.MouseLeftButtonDown -= TitleBlock_OnMouseLeftButtonDown;
- }
- base.OnApplyTemplate();
- _mainBorder = GetTemplateChild(ElementMainBorder) as Border;
- _titleBlock = GetTemplateChild(ElementTitleBlock) as TextBlock;
- if (_titleBlock != null)
- {
- _titleBlock.MouseLeftButtonDown += TitleBlock_OnMouseLeftButtonDown;
- }
- if (PopupElement != null)
- {
- _mainBorder.Child = PopupElement;
- }
- }
- internal static readonly DependencyProperty ContentStrProperty = DependencyProperty.Register(
- nameof(ContentStr), typeof(string), typeof(PopupWindow), new PropertyMetadata(default(string)));
- internal string ContentStr
- {
- get => (string) GetValue(ContentStrProperty);
- set => SetValue(ContentStrProperty, value);
- }
- private bool IsDialog { get; set; }
- public PopupWindow()
- {
- CommandBindings.Add(new CommandBinding(ControlCommands.Close, CloseButton_OnClick));
- CommandBindings.Add(new CommandBinding(ControlCommands.Confirm, ButtonOk_OnClick));
- CommandBindings.Add(new CommandBinding(ControlCommands.Cancel, ButtonCancle_OnClick));
- Closing += (sender, args) =>
- {
- if (!IsDialog)
- Owner?.Focus();
- };
- Loaded += (s, e) =>
- {
- if (!_showBackground)
- {
- var point = ArithmeticHelper.CalSafePoint(_targetElement, PopupElement, BorderThickness);
- Left = point.X;
- Top = point.Y;
- Opacity = 1;
- }
- };
- try
- {
- Owner = Application.Current.MainWindow;
- }
- catch
- {
- // ignored
- }
- }
- public PopupWindow(System.Windows.Window owner) : this() => Owner = owner;
- private void CloseButton_OnClick(object sender, RoutedEventArgs e) => Close();
- public FrameworkElement PopupElement { get; set; }
- public static readonly DependencyProperty ShowTitleProperty = DependencyProperty.Register(
- nameof(ShowTitle), typeof(bool), typeof(PopupWindow), new PropertyMetadata(ValueBoxes.TrueBox));
- public bool ShowTitle
- {
- get => (bool) GetValue(ShowTitleProperty);
- set => SetValue(ShowTitleProperty, ValueBoxes.BooleanBox(value));
- }
- public static readonly DependencyProperty ShowCancelProperty = DependencyProperty.Register(
- nameof(ShowCancel), typeof(bool), typeof(PopupWindow), new PropertyMetadata(ValueBoxes.FalseBox));
- public bool ShowCancel
- {
- get => (bool) GetValue(ShowCancelProperty);
- set => SetValue(ShowCancelProperty, ValueBoxes.BooleanBox(value));
- }
- public static readonly DependencyProperty ShowBorderProperty = DependencyProperty.Register(
- nameof(ShowBorder), typeof(bool), typeof(PopupWindow), new PropertyMetadata(ValueBoxes.FalseBox));
- public bool ShowBorder
- {
- get => (bool) GetValue(ShowBorderProperty);
- set => SetValue(ShowBorderProperty, ValueBoxes.BooleanBox(value));
- }
- private void TitleBlock_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- if (e.LeftButton == MouseButtonState.Pressed)
- {
- DragMove();
- }
- }
- public void Show(FrameworkElement element, bool showBackground = true)
- {
- if (!showBackground)
- {
- Opacity = 0;
- AllowsTransparency = true;
- WindowStyle = WindowStyle.None;
- ShowTitle = false;
- MinWidth = 0;
- MinHeight = 0;
- }
- _showBackground = showBackground;
- _targetElement = element;
- Show();
- }
- public void ShowDialog(FrameworkElement element, bool showBackground = true)
- {
- if (!showBackground)
- {
- Opacity = 0;
- AllowsTransparency = true;
- WindowStyle = WindowStyle.None;
- ShowTitle = false;
- MinWidth = 0;
- MinHeight = 0;
- }
- _showBackground = showBackground;
- _targetElement = element;
- ShowDialog();
- }
- public void Show(System.Windows.Window element, Point point)
- {
- Left = element.Left + point.X;
- Top = element.Top + point.Y;
- Show();
- }
- public static void Show(string message)
- {
- var window = new PopupWindow
- {
- AllowsTransparency = true,
- WindowStyle = WindowStyle.None,
- ContentStr = message,
- WindowStartupLocation = WindowStartupLocation.CenterScreen,
- Background = ResourceHelper.GetResourceInternal<Brush>(ResourceToken.PrimaryBrush)
- };
- window.Show();
- }
- public static bool? ShowDialog(string message, string title = default, bool showCancel = false)
- {
- var window = new PopupWindow
- {
- AllowsTransparency = true,
- WindowStyle = WindowStyle.None,
- ContentStr = message,
- IsDialog = true,
- WindowStartupLocation = WindowStartupLocation.CenterScreen,
- ShowBorder = true,
- Title = string.IsNullOrEmpty(title) ? Properties.Langs.Lang.Tip : title,
- ShowCancel = showCancel
- };
- return window.ShowDialog();
- }
- private void ButtonOk_OnClick(object sender, RoutedEventArgs e)
- {
- if (IsDialog)
- {
- DialogResult = true;
- }
- Close();
- }
- private void ButtonCancle_OnClick(object sender, RoutedEventArgs e)
- {
- if (IsDialog)
- {
- DialogResult = false;
- }
- Close();
- }
- protected override void OnClosed(EventArgs e)
- {
- base.OnClosed(e);
- PopupElement = null;
- }
- }
|