首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF:如何设置UserControl显示的对话框的所有者窗口?

在WPF中,要设置UserControl显示的对话框的所有者窗口,可以使用Window.Owner属性。以下是一个简单的示例:

  1. 首先,创建一个新的WPF项目,并添加一个名为MyUserControl的UserControl。
  2. MyUserControl的XAML文件中,添加一个按钮,并为其添加一个点击事件处理程序:
代码语言:xaml
复制
<UserControl x:Class="WpfApp1.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:WpfApp1"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
       <Button Content="打开对话框" Click="Button_Click"/>
    </Grid>
</UserControl>
  1. MyUserControl的代码文件中,添加一个点击事件处理程序,用于显示一个新的窗口,并将其所有者设置为当前UserControl所在的窗口:
代码语言:csharp
复制
using System.Windows;
using System.Windows.Controls;

namespace WpfApp1
{
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // 创建一个新的窗口
            Window dialog = new Window();

            // 将新窗口的所有者设置为当前UserControl所在的窗口
            dialog.Owner = Window.GetWindow(this);

            // 显示新窗口
            dialog.ShowDialog();
        }
    }
}

现在,当您在MyUserControl中点击按钮时,将显示一个新的窗口,并将其所有者设置为当前UserControl所在的窗口。这样,新窗口将始终保持在其所有者窗口的前面,并且不能离开其所有者窗口的范围。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Winform窗口嵌入WPFUserControl,关闭Winform父窗体方法

可以在form_load事件里把this传给UserControl,然后在usercontrol里调用form各种方法,不过这种做法不太好,耦合性较高。...标准做法是用事件传递 UserControl里加如下代码: public delegate void FormCloseEventHandler(object sender, EventArgs e...+= new UserControl.FormCloseEventHandler(this.userControl_FormClose); //不明白为什么是用类方法而非对象方法?...然后用这个方法不好使,还是出现我之前鬼影问题 private void userControl_FormClose(object sender, EventArgs e) { this.Close...(); } 改成用这个方法, 把elementHost1这个对象给销毁掉,这样似乎就好了, 鬼影问题是在用了第三方WpfToolkit之中DataGrid后出现,如果用.NET4.0里面的DataGrid

2.8K50

WPF 两个 Topmost 窗口如何设置谁在最上方

我需要有两个层级最高窗口,但是要求某个窗口在另一个上方,同时这两个窗口在所有其他应用程序窗口上方 需要用到 SetWindowLong win32 方法设置,假设我有 A 和 B 两个窗口...,我需要让这两个窗口都是 Topmost 同时 A 在 B 上方 大概逻辑如下 B.Loaded += (sender, args) => {...Loaded 之后,原因是为了窗口实际创建出来,拿到句柄 为什么还需要做延迟一拍设置,因为立刻设置可能和控件初始化冲突,如 Popup 刚好弹出,将不会收起。..., // 0xFFFFFFF8 GWL_HINSTANCE = -6, // 0xFFFFFFFA GWL_WNDPROC = -4, // 0xFFFFFFFC } 设置两个窗口有关联和...WPF 设置 Owner 几乎等价,只是这个 win32 方法可以在复杂项目也设置上去

83140

如何利用 Win32 API 设置两个窗口所有者(Owner)关系

设置两个窗口父子关系非常简单,只需要调用 SetParent 函数即可。然而设置两个窗口所有者(Owner)关系却没有一个简单直观 API。...那么本文介绍一下如何设置两个窗口 Owner 关系。...设置所有者(Owner) 由于方法非常简单,所以我直接贴出 MainWindow 中完整代码: public partial class MainWindow : Window { public...这样,程序启动时候,便会把自己窗口所有者设置为启动前最后一个前台窗口。...接下来是关键代码 SetWindowLong,传入三个参数: 自己窗口句柄 hwnd GWL_HWNDPARENT 即指定所有者(在官方文档中,依然将其描述为 parent`) 所有者窗口句柄 ownerHwnd

42930

WPF 获取全局所有窗口创建显示事件 监控窗口打开

本文将告诉大家如何WPF 里面进行全局监控任意窗口创建显示打开,可以获取到每个 WPF 窗口打开时机。...这是一个开发时辅助机制,用来让开发者不要随便弹出窗口,我又好奇这个监控模块是如何监控到我弹出一个窗口,学习了监控模块机制,就写了这个博客 在 WPF 里面,可以通过 EventManager 监听全局路由事件...于是就可以进行监控窗口创建显示 监听窗口 SizeChangedEvent 路由事件是比较靠谱方式,这个有一点点违反开发者想法,开发者默认想是使用 LoadedEvent 事件。...而 Window_OnLoaded 只会进入一次,在 MainWindow 准备显示时进入 我推荐在自己项目里面,在 Debug 下加上此机制,至少输出一下窗口显示日志,方便了解显示了哪些窗口。...也可以在事件里面对每个窗口注入一些有趣逻辑,或者是监听窗口各个事件,输出更多日志,让开发者可以通过日志了解到当前有哪些窗口依然还在显示 这是另一位大佬写代码,请看 https://gist.github.com

2K50

修复 WPF 窗口在启动期间短暂白底显示

修复 WPF 窗口在启动期间短暂白底显示 2017-11-03 15:08 不管你做 WPF 窗口做得多么简单,是否总感觉启动那一瞬间窗口内是白白一片...本文将介绍一种简单方法来彻底解决这个问题。 ---- 看看下面这张图,你便能知道本文要解决问题是否跟你希望解决是同一个问题: ? 是否发现窗口启动期间,窗口内容是白色呢?...然而基本上观点都是相似的: 这是 WPF 已知 BUG(this is a known issue in WPF) 可以先设置窗口 WindowState="Minimized",然后等 Loaded...发现使用 WindowChrome 定制窗口非客户区时候,此问题就不再出现了!!! 也就是说,此问题在微软彻底解决之前,也是有规避方案!——那就是 WindowChrome! 这是效果: ?...但是,由于此时开始能够在非客户区(NonClientArea)显示控件了,所以可能需要自己调整一下视觉效果。

2.2K10

直击本质:WPF 框架是如何实现模态窗口

想知道你在 WPF 编写 Window.ShowDialog() 之后,WPF 框架是如何帮你实现模态窗口吗? 本文就带你来了解这一些。...---- Window.ShowDialog WPF 显示模态窗口方法就是 Window.ShowDialog,因此我们直接进入这个方法查看。...由于 .NET Core 版本 WPF 已经开源,我们会使用 .NET Core 版本 WPF 源代码。...不要紧,我再简化一下: EnumThreadWindows 获取当前线程所有窗口 把当前线程中所有窗口都禁用掉(用是 Win32 API 禁用哦,这不会导致窗口内控件样式变为禁用状态) 将窗口显示出来...(如果出现异常,则还原之前禁用窗口) 可以注意到禁用掉窗口是“当前线程”哦。

44930

使用 SetParent 制作父子窗口时候,如何设置窗口窗口样式以避免抢走父窗口焦点

制作传统 Win32 程序以及 Windows Forms 程序时候,一个用户看起来独立窗口本就是通过各种父子窗口嵌套完成,有大量窗口句柄,窗口之间形成父子关系。...不过,对于 WPF 程序来说,一个独立窗口实际上只有一个窗口句柄,窗口所有内容都是 WPF 绘制。...如果你不熟悉 Win32 窗口父子窗口关系和窗口样式,那么很有可能遇到父子窗口之间“抢夺焦点”问题,本文介绍如何解决这样问题。...注意看下面的窗口标题栏,当我在这些不同区域间点击时候,窗口标题栏在黑色和灰色之间切换: 这说明当子窗口获得焦点时候,父窗口会失去焦点并显示失去焦点样式。...你可以看看 Spyxx.exe 抓出来默认普通窗口和子窗口样式差别: !

37860

PyQt5-如何设置应用和窗口图标?控件提示信息如何设置

1 如何设置应用和窗口图标?...1.1 导入需要包QApplication类是PyQt5应用程序类;QMainWindow类是一个主窗口类;QIcon类用于创建和管理图标;ctypes是python一个函数库,提供和C语言兼容数据类型...de app"ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)1.6 效果查看如下:图片1.7 解决图标不显示问题如果设置后图标不显示...,那么可能需要设置图标的路径为绝对路径;self.setWindowIcon(QIcon('F:\pyqt_study\images\myicon\hongbao.svg'))我这里使用相对路径确实是不显示图标了...pyqt_study\images\myicon\dingwei.svg')) win = IconSet() win.show() sys.exit(app.exec_())2 控件提示信息如何设置

1.1K40

如何监视 WPF所有窗口,在所有窗口中订阅事件或者附加 UI

由于 WPF 路由事件(主要是隧道和冒泡)存在,我们很容易能够通过只监听窗口某些事件使得整个窗口中所有控件发生事件都被监听到。然而,如果我们希望监听是整个应用程序中所有的事件呢?...路由事件路由可并不会跨越窗口边界呀? 本文将介绍我编写应用程序窗口监视器,来监听整个应用程序中所有窗口路由事件。这样方法可以用来无时无刻监视 WPF 程序各种状态。...---- 其实问题依旧摆在那里,因为我们依然无法让路由事件跨越窗口边界。更麻烦是,我们甚至不知道应用程序有哪些窗口,这些窗口都是什么时机显示出来。...这种操作意味着将来新打开窗口是不会被监听到事件。 我们有没有方法拿到新窗口显示事件呢?遗憾是——并不行。 但是,我们有一些变相处理思路。...于是,一开始时候,我们可以监听一些窗口激活事件。如果执行这段初始化代码时候没有任何窗口是激活状态,那么就监听所有窗口激活事件;如果有一个窗口是激活,那么就监听这个窗口取消激活事件。

38840

WPF 多线程 UI:设计一个异步加载 UI 容器

UI 的卡住不同于 IO 操作或者密集 CPU 计算,WPF UI 卡顿时,我们几乎没有可以让 UI 响应方式,因为 WPF 一个窗口只有一个 UI 线程。 No!...WPF 一个窗口可以不止一个 UI 线程,本文将设计一个异步加载 UI 容器,可以在主线程完全卡死情况下显示一个加载动画。...---- 本文是对我另一篇博客 WPF 同一窗口多线程 UI(VisualTarget) 一项应用。...▲ 异步加载效果预览 使用我写 WPF 异步加载控件 AsyncBox 控件名字为 AsyncBox,意为异步加载显示 UI 容器。...这样,我们就能在一个窗口显示两个可视化树了。 这两个可视化树通过 HostVisual 跨线程连接起来,于是我们能在一个窗口中得到两个不同线程可视化树。

3.7K10

C# WPF MVVM开发框架Caliburn.Micro Screens, Conductors 和 Composition⑦

一些屏幕示例可能是应用程序设置模式对话框、Visual Studio中代码编辑器窗口或浏览器中页面。你可能对此有很好直觉。...WindowManager工作方式与此类似,它作用有点像一个指挥者,目的是强制执行模态(仅限非模态WPF窗口生命周期。所以,生命周期并不神奇。...CustomerViewModel能够显示本地模式对话框(它们只是特定自定义记录模式对话框,而不是其他任何对话框)。...在上面描述状态中,DialogConductorActiveItem被设置为AddressViewModel实例,因此模态对话框与AddressView一起显示,并且基础CustomerView被禁用...我还创建了两个简单方法来显示对话框和消息框,这些对话框和消息框通过IDialogManager界面公开。

2.5K20

在VisualStudio中提供运行时和设计时支持WPF本地化解决方案

背景 关于WPF本地化问题有许多其他文章,包括使用Locbaml本地化WPF应用程序(https://www.codeproject.com/KB/WPF/Article.aspx),其中介绍了对XAML...如果您看到除了默认值之外为资源文件添加字符串似乎总是显示默认值,那么请检查每个RESX文件中资源字符串名称是否正确。...当您在UserControl中添加一个绑定到一个标签时,它将在运行时被正确地显示出来,在设计时(例如在Blend中),当它被自己加载时也会被正确展示。...不幸是,当您加载包含UserControl窗口时,它将无法展示出来。(这似乎只是Blend工具一个问题,在这种情况下,Visual Studio 2008设计器能够正常展示。)...我理解,将UserControl作为窗口子控件加载时问题是,设计器创建控件实例,然后将其添加到窗口中。运行时可用资源不存在,因为实例不是在窗口中创建,因此上面的绑定失败,无法呈现控件。

1.9K20

WPF开源项目:WPF-ControlBase

}"即可 整体主窗口采用ViewBox方式加载,当缩放窗口或应用到到其他分辨率设备都会兼容 5.3.3 主题配置信息保存 主题配置信息已经封装在ApplicationBase中,会自动在退出时保存设置配置信息...深色主题示例如下图: 主题设置功能主要包括: 设置主题主颜色 主题颜色主要用来标识要突出显示部分,目前可以选择内置颜色、可以选择跟随系统主题颜色、可以自定义选择颜色、可以使用动态主题(即设置主题每隔指定时间自动变化...5.5.1 数据表格 a 兼容主题字体和主题设置,后面将要提到所有控件均已应用主题设置,不做再说明 b 每页显示条数 可以设置每页要显示条数 c 搜索 可以设置搜索过滤条件,包含指定搜索项条目才会显示...采用内置对话框,不是应用窗口,只是覆盖层,可以避免窗口对话框引起一些问题 b 对话窗口自定义对话窗口 相对系统对话窗口更美观,增加显示和隐藏效果,通过注入方式可以自定义按钮个数和功能 c消息列表...目前有两种模式,分别是在窗口显示和Window系统中显示,可以根据需求自定义显示方式,示例如下 d 在线升级示例如下 e 导航菜单示例如下 f 其他功能包括 按钮控件、文本输入框控件、下拉列表控件

3.5K10

WPF开源项目:WPF-ControlBase

}"即可 整体主窗口采用ViewBox方式加载,当缩放窗口或应用到到其他分辨率设备都会兼容 5.3.3 主题配置信息保存 主题配置信息已经封装在ApplicationBase中,会自动在退出时保存设置配置信息...深色主题示例如下图: 主题设置功能主要包括: 设置主题主颜色 主题颜色主要用来标识要突出显示部分,目前可以选择内置颜色、可以选择跟随系统主题颜色、可以自定义选择颜色、可以使用动态主题(即设置主题每隔指定时间自动变化...5.5.1 数据表格 a 兼容主题字体和主题设置,后面将要提到所有控件均已应用主题设置,不做再说明 b 每页显示条数 可以设置每页要显示条数 c 搜索 可以设置搜索过滤条件,包含指定搜索项条目才会显示...采用内置对话框,不是应用窗口,只是覆盖层,可以避免窗口对话框引起一些问题 b 对话窗口自定义对话窗口 相对系统对话窗口更美观,增加显示和隐藏效果,通过注入方式可以自定义按钮个数和功能 c消息列表...目前有两种模式,分别是在窗口显示和Window系统中显示,可以根据需求自定义显示方式,示例如下 d 在线升级示例如下 e 导航菜单示例如下 f 其他功能包括 按钮控件、文本输入框控件、下拉列表控件

3.5K30

Xamarin Forms WPF 干掉默认窗口导航条

在创建默认 Xamarin Forms WPF 应用,将和 UWP 应用界面不相同,在 WPF 项目会显示顶部蓝色一条,看起来不好看,那么可以如何干掉他 下图是一个默认 Xamarin Forms...此时显示工具蓝色条就是本文说 窗口导航条,在 Xamarin Forms 源代码,这个导航条是在 FormsWindow.xaml 文件里面,使用 PART_TopAppBar 控制,也就是想要不显示这个工具栏...在 Xamarin Forms 源代码 FormsWindow.xaml 是通过绑定设置是否显示 <controls:FormsAppBar x:Name="PART_TopAppBar" Visibility...false; // 忽略代码 } 而 FormsPage GetHasNavigationBar 方法如下 public class FormsPage : UserControl...WPF 版本里面,在 WPF 实现了大量基础控件,和 Xamarin Forms 对应,此时做实际交互和渲染都是原生 WPF 控件,这样能提升性能

1.3K10
领券