首页 > 其他分享 >WPF PopUp的简单使用

WPF PopUp的简单使用

时间:2024-08-08 09:17:35浏览次数:13  
标签:PopUp int win void Window static 简单 WPF public

<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

相关文章

  • 如何创建一个简单的音乐推荐页面:从零开始的指南(内含完整代码)
    如何创建一个简单的音乐推荐页面:从零开始的指南引言在这篇博客中,我们将学习如何创建一个简单的音乐推荐页面。这个项目将帮助你熟悉HTML、CSS和JavaScript的基本使用。我们会创建一个现代化的页面,包括一个顶部导航栏、一个轮播图展示最新音乐、一个推荐歌曲列表以及一个基础......
  • Spring Boot 3 + MinIO集群 + Nginx 负载均衡 实现图片(头像)的上传 + 更新替换 + 下载
    1.容器准备1.1容器结构 1.2启动容器1.3docker-compose.ymlversion:'3.8'#指定DockerCompose文件的版本,这里使用版本3.8services:minio1:image:minio/minio:latest#使用最新的MinIO镜像来创建MinIO服务的容器volumes:-./data1......
  • python opencv图片简单操作
    一、从文件读取图片cv2.imread(filename,flags) 参数: filepath:读入image的完整路径 flags:标志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED} cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可用1作为实参替代 cv2.IMREAD_GRAYSCALE:读入......
  • wpf 中的三个 UnhandledException
    结构化异常处理在异常点生成异常的结构体,异常分发WPF中的三个Excption处理函数AppDomain::UnhandledException事件属性UI线程和Thread实例的异常会触发该事件。Application::DispatcherUnhandledExcetion事件属性UI线程异常会触发该事件。如果事件的IsHandle=false,异......
  • jeecg-vue3, BasicTable与抽屉useDrawer()的简单使用
    需求:分屏情况下,根据传入参数不同查看申请材料1.实现效果点击申请材料弹出,点击取消或点击空白处,抽屉消失2.代码实现2.1files.vue实现<template><divclass="container"><a-button@click="click('sqcl')"style="margin-left:5px;">申请材料</a-b......
  • 简单项目部署流程
    本次项目部署至公司内网服务器上,内网IP为192.168.xx.xxx。项目打包:打包前可能要对项目的改动:配置文件中端口号,数据库等信息。​通过Maven的package打包成jar文件,其存放于项目的target文件夹下。将jar包复制到服务器的文件夹中,在其目录中cmd输入命令java-jarxxx.jar保......
  • 第十四章 -------------------WPF 和MVVM实战
    我的感悟:在编程时我刚开始是使用的MFC,现在回想起来当时我是怎么把程序运行起来的,我记得我当时是在View里面操作数据,在View里面操作Fream。可以说是糟糕的一塌糊涂,后期维护也是相当困难,这一点我现在回想起来想吐。------------------------------------------------------------......
  • pytorch深度学习分类代码简单示例
    train.py代码如下importtorchimporttorch.nnasnnimporttorch.optimasoptimmodel_save_path="my_model.pth"#定义简单的线性神经网络模型classMyModel(nn.Module):def__init__(self):super(MyModel,self).__init__()self.output=n......
  • 【设计模式#1】Facade设计模式(外观设计模式)的简单理解
    最近接手了一个需要重构的老项目,里面大量使用了Facade设计模式来整合各个子系统的功能,故简单梳理学习一下该设计模式的概念。外观模式(FacadePattern)是一种结构型设计模式,它通过为复杂子系统提供一个简单的接口,从而简化客户端与子系统的交互。为了更好地理解这一模式,我们可以举一......
  • 贝壳的面经!怎么好像有点简单?
    今天分享粉丝最新投稿的北京贝壳外包面经,我把项目相关的都去掉了,其他的问题整理下来感觉不是很难,你觉得呢?换做是你的话你答得出来吗?面经整理如下:北京贝壳外包自我介绍项目拷打Redis跟MySQL以及Kafka之间是什么关系?Redis是内存数据结构存储系统,用于快速读写和高并发......