精华内容
下载资源
问答
  • 2015-08-06 01:04:53
    
                {
                    //此程序实现窗体居中显示 
                    Window1 myWindow1 = new Window1();
                    double screeHeight = SystemParameters.FullPrimaryScreenHeight;
                    double screeWidth = SystemParameters.FullPrimaryScreenWidth;
                    myWindow1.Top = (screeHeight - this.Height) / 2;
                    myWindow1.Left = (screeWidth - this.Height) / 2;
                    myWindow1.Show();
                }
    更多相关内容
  • 变更触发机制解决:1)单实例窗口窗口每次隐藏后再显示时,位置居中显示2)多屏幕下单实例窗口,当父窗口移动到其它屏幕时,单实例窗口再次弹出时,位置才更新到父窗口屏幕。3)子窗口每次唤...

    本文经原作者授权以原创方式二次分享,欢迎转载、分享。

    原文作者:唐宋元明清

    原文地址:https://www.cnblogs.com/kybs0/p/7420767.html

    窗口居中 & 变更触发机制

    解决:

    1)单实例窗口,窗口每次隐藏后再显示时,位置居中显示

    2)多屏幕下单实例窗口,当父窗口移动到其它屏幕时,单实例窗口再次弹出时,位置才更新到父窗口屏幕。

    3)子窗口每次唤醒时,都居中显示。

    窗口首次显示的位置 - WindowStartupLocation

    Windows的启动时位置显示,WindowStartupLocation

    • CenterOwner --显示在父窗口的中间(设置Owner)

    • CenterScreen --显示在当前屏幕中间

    • Manual --默认位置 当第一次Window.ShowDialog时,window显示如上设置。

    变更触发机制 上面只涉及到了首次显示位置,之后,窗口的位置会继续保留

    如何设置窗口隐藏之后再次弹出时,显示在中间(CenterOwner/CenterScreen)?如何设置窗口一直停留在显示在中间?

    我们先了解一下,有哪些触发机制

    • Activated 窗口激活 窗口变更为前台窗口时(即显示在最前面),会触发

    • IsVisibleChanged 显示变更 当我们设置窗口隐藏Hide()时,IsVisibile=false.窗口再次ShowDialog时,IsVisibile=true; 利用如上俩种机制,下面就可以搞事情了。

    首先定义几个枚举:

    /// <summary>
        /// 窗口显示变更触发时机
        /// </summary>
        public enum WindowLocationInvokeOccasion
        {
            /// <summary>
            /// 只要Activated就显示在中间
            /// </summary>
            Activated = 0,
    
            /// <summary>
            /// 只在第一次Activated时,显示在中间一次,之后的变化就不修改
            /// </summary>
            FirstActivated,
    
            /// <summary>
            /// 窗口每次显示时,窗口居中
            /// <para>可以解决单实例窗口弹出不居中问题</para>
            /// </summary>
            Visibile,
    
            /// <summary>
            /// 窗口每次显示时,如父窗口与当前窗口不在同一屏幕时,窗口居中
            /// <para>可以解决单实例窗口弹出不居中问题</para>
            /// </summary>
            VisibileInDifferentScreen,
    
            /// <summary>
            /// 不触发
            /// </summary>
            Defatult
        }

    如上枚举包含了4种触发机制。

    我们再定义个附加属性,通过附加属性去设置窗口的额外功能-居中显示触发机制

    /// <summary>
    /// 窗口显示居中触发时机
    /// <para>另:居中显示设置,请使用<see cref="Window"/>的<see cref="WindowStartupLocation"/>属性</para>
    /// </summary>
    public static readonly DependencyProperty InvokeOccasionProperty = DependencyProperty.RegisterAttached(
        "InvokeOccasion", typeof(WindowLocationInvokeOccasion), typeof(WindowLocationOptions),
        new PropertyMetadata(default(WindowLocationInvokeOccasion), InvokeOccasionProperty_ChangedCallback));

    在属性更改触发事件中,根据不同的触发条件,设置不同的居中显示。

    • Activated --只要Activated就显示在中间 每次触发,直接显示窗口即可;

    • 首次Activated通过设置Window.Activated -= ShowInCenter_Activated;禁用下次触发进入

    • Visibile

    • VisibileInDifferentScreen窗口显示时,如父窗口与当前窗口不在同一屏幕时,窗口居中. 怎么判断当前子窗口与父窗口是否在同一屏幕?

    var screen = Screen.FromHandle(new WindowInteropHelper(parentWindow).Handle);
    
    Graphics currentGraphics = Graphics.FromHwnd(new WindowInteropHelper(parentWindow).Handle);
    double dpiXRatio = currentGraphics.DpiX / 96;
    double dpiYRatio = currentGraphics.DpiY / 96;
    
    //当子窗口与父窗口所在屏幕相同时,不作处理
    var isSubWindowInSameScreen = subWindow.Left > screen.Bounds.Left / dpiXRatio &&
                                    subWindow.Left < screen.Bounds.Left / dpiXRatio + screen.Bounds.Width / dpiXRatio &&
                                    subWindow.Top > screen.Bounds.Top / dpiYRatio &&
                                    subWindow.Top < screen.Bounds.Top / dpiYRatio + screen.Bounds.Height / dpiYRatio;
    return isSubWindowInSameScreen;

    绍完成触发条件,下面说下窗口居中显示。居中显示,分为当前屏幕内居中/主窗口内居中,直接上代码

    1)在主窗口中居中显示-CenterOwner 设置窗口的依靠位置Location(Left,Top)(左上角)

    • 子窗口最大化时 --WindowState=“Maximized”最大化窗口,固定的弹出到主屏幕,因此需额外处理,根据屏幕Location设置位置;

    • 父窗口最大化时 --父窗口最大化时,父窗口的location,因窗口设置margin,有可能不准确,故取屏幕位置

    • CenterOwner窗口居中显示 --直接取父窗口的位置/大小和子窗口的大小,进行计算即可;
      PS:窗口的位置Left/Top可能为负

    /// <summary>
    /// 在主窗口中居中显示
    /// </summary>
    /// <param name="subWindow"></param>
    /// <param name="parentWindow"></param>
    private static void SetWindowInCenterOwner(Window subWindow, Window parentWindow)
    {
        //最大化窗口,固定的弹出到主屏幕,因此需额外处理
        if (subWindow.WindowState == WindowState.Maximized)
        {
            //子窗口最大化时,需要根据屏幕设置位置;
            var screen = Screen.FromHandle(new WindowInteropHelper(parentWindow).Handle);
    
            Graphics currentGraphics = Graphics.FromHwnd(new WindowInteropHelper(parentWindow).Handle);
            double dpiXRatio = currentGraphics.DpiX / 96;
            double dpiYRatio = currentGraphics.DpiY / 96;
    
            subWindow.Left = screen.Bounds.Left / dpiXRatio;
            subWindow.Top = screen.Bounds.Top / dpiYRatio;
        }
        if (parentWindow.WindowState == WindowState.Maximized)
        {
            //父窗口最大化时,父窗口的location,因窗口设置margin,有可能不准确,故取屏幕位置
            var screen = Screen.FromHandle(new WindowInteropHelper(parentWindow).Handle);
    
            Graphics currentGraphics = Graphics.FromHwnd(new WindowInteropHelper(parentWindow).Handle);
            double dpiXRatio = currentGraphics.DpiX / 96;
            double dpiYRatio = currentGraphics.DpiY / 96;
    
            //窗口居中显示
            subWindow.Left = screen.Bounds.Left / dpiXRatio +
                                (screen.Bounds.Width / dpiXRatio - subWindow.ActualWidth) / 2;
            subWindow.Top = screen.Bounds.Top / dpiYRatio +
                            (screen.Bounds.Height / dpiYRatio - subWindow.ActualHeight) / 2;
        }
        else
        {
            //窗口居中显示
            subWindow.Left = parentWindow.Left + (parentWindow.ActualWidth - subWindow.ActualWidth) / 2;
            subWindow.Top = parentWindow.Top + (parentWindow.ActualHeight - subWindow.ActualHeight) / 2;
        }
    }

    2)当前屏幕内居中-CenterScreen;

    • 窗口位置设置和上面的一样,值得注意的是DPI

    • 通过win的显示设置,调整文本显示比例,屏幕的位置转换(X,Y)``,得考虑DPI`的换算;

    /// <summary>
    /// 在父窗口所在屏幕居中显示
    /// </summary>
    /// <param name="subWindow"></param>
    /// <param name="parentWindow"></param>
    private static void SetWindowInCenterScreen(Window subWindow, Window parentWindow)
    {
        SetWindowLocationInScreen(subWindow, parentWindow, subWindow.WindowState);
    }
    
    private const int DpiPercent = 96;
    
    private static void SetWindowLocationInScreen(Window subWindow, Window parentWindow, WindowState windowState)
    {
        var intPtr = new WindowInteropHelper(parentWindow).Handle;
        var screen = Screen.FromHandle(intPtr);
    
        using (Graphics currentGraphics = Graphics.FromHwnd(intPtr))
        {
            double dpiXRatio = currentGraphics.DpiX / DpiPercent;
            double dpiYRatio = currentGraphics.DpiY / DpiPercent;
    
            if (windowState == WindowState.Maximized)
            {
                //设置全屏Location
                subWindow.Left = screen.Bounds.Left / dpiXRatio;
                subWindow.Top = screen.Bounds.Top / dpiYRatio;
            }
            else
            {
                //设置居中Location
                subWindow.Left = screen.Bounds.Left / dpiXRatio +
                                    (screen.Bounds.Width / dpiXRatio - subWindow.ActualWidth) / 2;
                subWindow.Top = screen.Bounds.Top / dpiYRatio +
                                (screen.Bounds.Height / dpiYRatio - subWindow.ActualHeight) / 2;
            }
        }
    }
    展开全文
  • wpf 窗口标题居中

    2013-04-08 17:10:06
    诸位老师好。... 在wpf中窗体的title居中显示。目前是居左显示的。 如图效果。 [img=http://img.my.csdn.net/uploads/201304/08/1365412122_4977.png][/img] 如何能让其居中显示呢。 多谢了。
  • WPF按钮的文本内容是否出现在文本上方不需要的空格中?我在StackPanel中有一个按钮。这个按钮是一个简单的关闭按钮,所以我希望它显示为一个方形按钮,其中有一个“x”。我已将我的填充设置为零,并将Horizo​​...

    WPF按钮的文本内容是否出现在文本上方不需要的空格中?

    我在StackPanel中有一个按钮。这个按钮是一个简单的关闭按钮,所以我希望它显示为一个方形按钮,其中有一个“x”。我已将我的填充设置为零,并将Horizo​​ntalContentAlign和VerticalContentAlign设置为Center,但“x”仍然出现在按钮的底部(如果我的FontSize相对于我的高度太大,甚至会被截断)。就好像按钮顶部有一些填充物会阻止文本使用完整的垂直空间。

    我的XAML是:

    x

    如果我将按钮VerticalContentAlign属性设置为Stretch甚至Top,问题就完全一样了。如果我删除“高度”和“权重”属性以使按钮确定其自身,则控件不会显示为正方形而是直立的矩形,并且“x”仍然不居中。

    更新:

    虽然按钮和内容现在都完美居中,但按钮仍然显示得比它需要的大得多,就像正在应用高填充一样。

    我的资源样式定义现在如下:

    按钮本身定义为:

    Visibility="{Binding GenderFilterExpander.ClearFilterVisibility}" />

    Visibility="{Binding GenderFilterExpander.SelectedValueVisibility}" />

    扩展器位于DockPanel内GroupBox内的StackPanel内。

    在设计视图中,按钮的大小正确,只包含X,但在运行时它们会变大。我该如何纠正?

    展开全文
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...

    1.只有在revit中使用UI按钮的情况下

    在这里插入图片描述
    new一个窗口出来的时候判断是否存在,如果存在了,再点击的时候,就用IsVisible判断,则不让第二次点击的窗口创建。
    注:需要窗口是静态的
    在这里插入图片描述

    2.此时会有一个问题

    这样能实现点击同一个按钮时,第二次点击无效,即不弹出俩个一样的窗口。但是在关闭了窗口时报错:关闭 Window 之后,无法设置 Visibility,也无法调用 Show、ShowDialogor 或 WindowInteropHelper.EnsureHandle。”

    这个时候需要用到重写onclosing方法:

    	 /// <summary>
        /// 重写OnClosing事件 解决窗口关闭不能再开的bug。
        /// </summary>
        /// <param name="e"></param>
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            this.Hide();
            e.Cancel = true;
        }
    

    或者:
    在这里插入图片描述
    在这里插入图片描述
    加个事件就能完成效果了!

    展开全文
  • WPF开发者QQ群:340500857 | 微信群 -> 进入公众号主页加入组织01—代码如下一、创建项目,命名为LoginWindow,然后创建以下目录结构:二、导入图片三...
  • c#窗体标题文本居中

    千次阅读 2020-04-11 21:14:53
    //Graphics g = this.CreateGraphics(); //Double startingPoint = (this.Width / 2) - (g.MeasureString(this.Text.Trim(), this.Font).Width / 2); //Double ws = g.MeasureString("*", t...
  • WPF窗口跳转及window和page区别

    万次阅读 2018-11-15 02:39:35
    WPF窗口跳转及window和page区别
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • WPF窗体

    2021-07-28 08:30:15
    开发工具与关键技术:WPF窗体 作者:李哲定 撰写时间:2021年7月27日 在创建WPF应用的时候,你第一个看到的就是窗体类。它作为窗体的基础,提供标准的边框、工具条、最大化、最小化和关闭按钮。WPF窗体是XAML文件和...
  • WPF TabControl中纵向显示TabItem及标题文字tags: wpf C#这次要实现个功能,先把最终结效果图放上来: 其中就是红色框框圈出来的部分,这里有两种实现效果,第一种,将文字还是水平排列,但是整体旋转90度(第一个...
  • 我们新建一个WPF程序,在Grid面板中加入ScrollViewer控件,然后在控件里面拖入一个TexBox用来显示文字,拖动时注意将窗口大小设置小一点,把TextBox的大小设置大一点,让里面的文字不能够全部看完,需要拖动滚动条...
  • C#WPF 控件

    2021-07-28 19:28:42
    (4)、当内容超出窗口则超出的部分被截断,两个设置之间是水平排布的,而设置1内的内容是垂直排布的,设置2的内容是水平排布的而且内容是水平居中和垂直居中。 IV.WrapPanel:自动折行面板(环绕面板) 1.(1)、...
  • 大家在vs中新建wpf项目后,会发现在添加新建项时会出现下列三个选项 它们有什么区别呢? 区别: 页:通常用于网页 窗口:通常一个桌面app只有一个主窗口 用户控件:控件需要被重复用时,比如在很多窗口中,用同...
  • WPF的新建预定页面

    2019-08-05 10:24:25
    开发工具与关键技术:MVC/C#、WPF 作者:张文静 撰写时间:2019/08/05 基于XAML语音的“新建预定”页面,见截图: 首先,使用网格布局页面,自定义行,定义一个三行的网格,然后设置行高的比例。在第零行,放置了一...
  • WPF Prism(六)Dialog

    千次阅读 2021-03-04 19:59:29
    可以弹出一个我们指定得窗口,仅此而已那么在Prism当中,Dialog指的什么? Prism提供了一组对话服务,封装了常用的对话框组件的功能,例如: RegisterDialog/IDialogService (注册对话及使用对话) 打开对话框传递...
  • WPF】获取控件句柄

    2021-06-25 12:14:42
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • WPF概述简介

    2020-05-07 21:37:37
    WPF概述内置硬件加速分辨率无关特性功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants...
  • 文章目录背景解决过程删除历史导航——不好用功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • C#WPF 常用控件

    千次阅读 2021-07-28 19:37:55
    (2)、设置按钮的左右上下停靠,利用布局控件进行按钮与文字相结合,设置文字的水平居中。 3.(1).Canvas (画布控件),用来画图的。也可以用来做容器用。子控件根据left/right和 top/bottom来获取相对与canvas边界...
  • WPF无边框窗体】

    千次阅读 2016-04-20 18:16:18
    WPF是Windows操作系统中一次重大变革,与早期的GDI+/GDI不同。 WPF是基于DirectX引擎的,支持GPU硬件加速,在不支持硬件加速时也可以使用软件绘制。 利用WPF创建无边框的窗体: 第一种方式:设置WindowStyle=...
  • WPF窗口置于桌面下方(可用于动态桌面) 先来看一下效果: 界面元素很简单,就一个Button按钮,然后写个定时器,定时更新Button按钮中的内容为当前时间,下面来介绍下原理,和界面组成。 窗口介绍 Windows...
  • WPF应用程序简介

    2021-08-06 20:13:29
    WPF控件分类 布局控件:Panel 内容控件:ContentControl 只能容纳一个控件或布局控件 带标题内容控件:内容控件可以设置标题 Header 父类:HeaderedContentControl 条目控件:可以显示一列数据,数据类型一般相同 ...
  • WPF】Blend制作WPF的动画

    千次阅读 2020-10-17 09:14:26
    文章目录 连续动画 目标效果 Blend实现 动画的调用 等待效果 路径... } 如果启动动画、关闭动画出现黑色背景,多半是因为window的style没有设置为None,而且AllowsTransparency设置为true,标题栏需要自己画 效果演示
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • wpf通用窗体模板

    2017-09-15 17:21:00
    下面是自定义样式,可写在资源字典Dictionary1.xaml中:代码中窗口标题行背景颜色的透明一定不能设置不透明,否则会将放大缩小关闭按钮遮盖住。如果对背景颜色没要求,建议不要设置背景颜色,或者把代码中标红部分...
  • WPF浅谈

    2019-06-28 08:43:01
    1.创建WPF应用,这个直接选择新建项目,选择WPF应用就可以了 2.我们先看App.xaml这个文件,里面设置了应用程序的起始文件与资源 ;App.xaml.cs属于App.xaml的后台文件,继承自System.Windows.Application,用于...
  • 使用Grid来对WPF页面进行布局排版
  • 窗体在当前显示窗口居中,其尺寸在窗体大小中指定。 CenterScreen = 1 , // // 摘要: // 窗体定位在 Windows 默认位置,其尺寸在窗体大小中指定。 WindowsDefaultLocation = 2 , // // 摘要...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 225
精华内容 90
关键字:

wpf窗口标题居中