欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# wpf解决Popup弹出位置异常问题解决

程序员文章站 2022-03-21 08:02:38
目录问题描述使用popup控件作为弹出框,使用相对位置弹出即placement=“relative”,在不同的设备中弹出的位置不一致。比如下面的例子。使用如下代码:

问题描述

使用popup控件作为弹出框,使用相对位置弹出即placement=“relative”,在不同的设备中弹出的位置不一致。比如下面的例子。

使用如下代码:

<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="360" width="640">
    <grid>
        <togglebutton x:name="btn_popup"  width="70" height="35"  content="弹出"  />
        <popup  x:name="popup1" 
                            placement="relative"
                            allowstransparency="true"
                            placementtarget="{binding elementname=btn_popup}" 
                            isopen="{binding ischecked, elementname=btn_popup}"
                            staysopen="false"
                            width="120" 
                            height="120"
                            horizontaloffset="80" 
                            verticaloffset="-125"                        
                            >
            <grid>
                <border   width="120" height="60" borderbrush="#333333" borderthickness="1" cornerradius="10" background="white" >
                    <textblock text="弹出框"  fontsize="16" horizontalalignment="center" verticalalignment="center" />
                </border>
            </grid>
        </popup>
    </grid>
</window>

显示效果:

C# wpf解决Popup弹出位置异常问题解决

C# wpf解决Popup弹出位置异常问题解决

原因分析

出现这样的情况,主要原因是windows的系统设置不同导致的问题。弹出框会根据系统的菜单位置设置的不同弹出的参考点会相应改变。

查看设置的方法:

使用组合键“win+r”,调出“运行”对话框,在文本框中输入“shell:::{80f3f1d5-feca-45f3-bc32-752c152e456e}”

C# wpf解决Popup弹出位置异常问题解决

打开后选择其他。发现大部分系统默认为左手打开。但是当有些系统被人为的设置为右手打开时,popup的弹出位置就异常了。

C# wpf解决Popup弹出位置异常问题解决

解决方法

方法一、 修改系统配置
(1)手动修改
参考上面
(2)通过win32 api修改

        [dllimport("user32.dll", entrypoint = "systemparametersinfo", setlasterror = true)]
        public static extern bool systemparametersinfoset(uint action, uint uiparam, uint vparam, uint init);
        void setmenualign()
         {
         //uiparam为false时设置弹出菜单左对齐,true则右对齐
         systemparametersinfoset(0x001c /*spi_setmenudropalignment*/, 0, 0, 0);
         }

方法二、调整代码
采用 placement="absolute"的方式弹出popup即可:

<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="360" width="640">
    <grid>
        <togglebutton x:name="btn_popup"  width="70" height="35"  content="点击弹出"  />
        <popup  x:name="popup1" 
                            placement="absolute"
                            allowstransparency="true"
                            placementtarget="{binding elementname=btn_popup}" 
                            isopen="{binding ischecked, elementname=btn_popup}"
                            staysopen="false"
                            width="120" 
                            height="120"
                            horizontaloffset="80" 
                            verticaloffset="-100"    
                            opened="popup1_opened"      
                            >
            <grid>
                <border   width="120" height="60" borderbrush="#333333" borderthickness="1" cornerradius="10" background="white" >
                    <textblock text="弹出框"  fontsize="16" horizontalalignment="center" verticalalignment="center" />
                </border>
            </grid>
        </popup>
    </grid>
</window>

在cs中计算相对位置:

 private void popup1_opened(object sender, eventargs e)
        {
            popup pop = sender as popup;
            if (pop == null)
                return;
            if (pop.placementtarget == null)
                return;
            if (pop.placement == placementmode.absolute)
            {
                var relative = pop.placementtarget.pointtoscreen(new point(0, 0));
                pop.horizontaloffset = relative.x + 80;
                pop.verticaloffset = relative.y + -100;
            }
        }

到此这篇关于c# wpf解决popup弹出位置异常问题解决的文章就介绍到这了,更多相关c# popup弹出位置异常内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: C# Popup 弹出