ざこノート
2018-05-25 [WPF]

[WPF] C# ポップアップをマウスや指定コントロール.の位置に表示

Popupコントロールを使用したメッセージを表示します。表示位置を選択する使用例です。

環境

  • Windows 10 Pro 64bit 1709
  • Visual Studio Community 2017 15.5.7
  • .NET Framework 4.6.1
  • C# 7.0

結果

var popup = new PopupController();

// マウスカーソルの位置に表示
popup.Open("エラー", "入力してね!");
マウスカーソルの位置にポップアップ表示
// 特定のコントロールの位置に表示
popup.Open("エラー", "入力してね!", TextBox1);
指定したコントロールの位置にポップアップ表示

実装

using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Documents;
using System.Windows.Media;

class PopupController
{
    public Popup Popup { get; }
    public TextBlock TextBlock { get; }
    public Border Border { get; }

    public PopupController()
    {
        Popup = new Popup
        {
            IsOpen = false,
            StaysOpen = false,
            AllowsTransparency = true,
            PopupAnimation = PopupAnimation.Fade,
            Focusable = true,
        };

        Border = new Border
        {
            Background = Brushes.DarkOrange,
            BorderBrush = Brushes.OrangeRed,
            BorderThickness = new Thickness(1.0d),
            Padding = new Thickness(4.0d)
        };

        TextBlock = new TextBlock { Foreground = Brushes.White };

        Popup.Child = Border;
        Border.Child = TextBlock;

        Popup.MouseDown += (sender, args) => Popup.IsOpen = false;
    }

    public void Open(string title, string text, UIElement target = null)
    {
        Popup.IsOpen = false;
        TextBlock.Inlines.Clear();

        if (!string.IsNullOrWhiteSpace(title))
        {
            TextBlock.Inlines.Add(new Bold(new Run(title)));
        }
        if (!string.IsNullOrWhiteSpace(text))
        {
            if (TextBlock.Inlines.Count > 0)
                TextBlock.Inlines.Add(new LineBreak());
            TextBlock.Inlines.Add(new Run(text));
        }

        Popup.PlacementTarget = target;
        Popup.Placement = target == null ? PlacementMode.Mouse : PlacementMode.Bottom;
        Popup.IsOpen = true;
    }
}

感謝