<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="250" Width="400" FontFamily="Microsoft YaHei" FontWeight="ExtraLight" > <Window.Resources> </Window.Resources> <Border Margin="10" Background="White" CornerRadius="10"> <Grid> <!--内容区--> <Button Width="50" Height="30" Content="ok" Name="PopButton" Click="PopButton_Click"/> <Popup x:Name="Pop" PopupAnimation="Slide" Width="180" Height="250" PlacementTarget="{Binding ElementName=PopButton}" Placement="Bottom" AllowsTransparency="True" StaysOpen="False"> <Grid> <Rectangle Fill="White" Margin="5" Opacity="0.8" RadiusY="2" RadiusX="2"> <Rectangle.Effect> <DropShadowEffect Color="#FFBBBBBB" Direction="0" BlurRadius="15" RenderingBias="Quality" ShadowDepth="1"></DropShadowEffect> </Rectangle.Effect> </Rectangle> <StackPanel Margin="15"> <TextBlock Text="设置" FontSize="14" Margin="0 0 0 5"/> </StackPanel> </Grid> </Popup> </Grid> </Border> </Window>
namespace WpfApp1 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void PopButton_Click(object sender, RoutedEventArgs e) { Pop.IsOpen = true;//设置为打开状态 } } }
解决Popup控件跟随移动和始终位于最上层问题 1.重写popup控件 public class PopupEx : Popup { /// <summary> /// 是否窗口随动,默认为随动(true) /// </summary> public bool IsPositionUpdate { get { return (bool)GetValue(IsPositionUpdateProperty); } set { SetValue(IsPositionUpdateProperty, value); } } public static readonly DependencyProperty IsPositionUpdateProperty = DependencyProperty.Register("IsPositionUpdate", typeof(bool), typeof(PopupEx), new PropertyMetadata(true, new PropertyChangedCallback(IsPositionUpdateChanged))); private static void IsPositionUpdateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { (d as PopupEx).pup_Loaded(d as PopupEx, null); } /// <summary> /// 加载窗口随动事件 /// </summary> public PopupEx() { this.Loaded += pup_Loaded; } /// <summary> /// 加载窗口随动事件 /// </summary> private void pup_Loaded(object sender, RoutedEventArgs e) { Popup pup = sender as Popup; var win = VisualTreeHelper.GetParent(pup); while (win != null && (win as Window) == null) { win = VisualTreeHelper.GetParent(win); } if ((win as Window) != null) { (win as Window).LocationChanged -= PositionChanged; (win as Window).SizeChanged -= PositionChanged; if (IsPositionUpdate) { (win as Window).LocationChanged += PositionChanged; (win as Window).SizeChanged += PositionChanged; } } } /// <summary> /// 刷新位置 /// </summary> private void PositionChanged(object sender, EventArgs e) { try { var method = typeof(Popup).GetMethod("UpdatePosition", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (this.IsOpen) { method.Invoke(this, null); } } catch { return; } } //是否最前默认为非最前(false) public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(typeof(Popup), new FrameworkPropertyMetadata(false, OnTopmostChanged)); public bool Topmost { get { return (bool)GetValue(TopmostProperty); } set { SetValue(TopmostProperty, value); } } private static void OnTopmostChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { (obj as PopupEx).UpdateWindow(); } /// <summary> /// 重写拉开方法,置于非最前 /// </summary> /// <param name="e"></param> protected override void OnOpened(EventArgs e) { UpdateWindow(); } /// <summary> /// 刷新Popup层级 /// </summary> private void UpdateWindow() { var hwnd = ((HwndSource)PresentationSource.FromVisual(this.Child)).Handle; RECT rect; if (NativeMethods.GetWindowRect(hwnd, out rect)) { NativeMethods.SetWindowPos(hwnd, Topmost ? -1 : -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0); } } [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; } #region P/Invoke imports & definitions public static class NativeMethods { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); [DllImport("user32", EntryPoint = "SetWindowPos")] internal static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags); } #endregion }
.在界面中使用 <local:PopupEx x:Name="pop1" Topmost="False" StaysOpen="True" PopupAnimation="Slide" AllowsTransparency="False" PlacementTarget="{Binding ElementName=popImg}" Placement="Left"> <local:PopupControl x:Name="pop_view"/> </local:PopupEx> 原文链接:https://blog.csdn.net/qq_43024228/article/details/110353099
标签:PopUp,int,win,void,Window,static,简单,WPF,public From: https://www.cnblogs.com/ywtssydm/p/18348268