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

在C#中使用线程时,窗体不会在父窗体的中心打开

是因为在多线程环境下,窗体的位置设置需要在UI线程中进行,而不是在后台线程中进行。这是因为UI元素只能在创建它们的线程上进行操作。

为了解决这个问题,可以使用委托和Invoke方法来确保在UI线程中设置窗体的位置。具体步骤如下:

  1. 在主窗体的代码中,定义一个委托类型,用于在UI线程中设置子窗体的位置。例如:
代码语言:csharp
复制
delegate void SetFormPositionDelegate(Form form);
  1. 在创建子窗体的代码中,使用Invoke方法调用委托来设置子窗体的位置。例如:
代码语言:csharp
复制
private void OpenChildForm()
{
    ChildForm childForm = new ChildForm();
    childForm.StartPosition = FormStartPosition.CenterScreen;

    if (this.InvokeRequired)
    {
        this.Invoke(new SetFormPositionDelegate(SetFormPosition), childForm);
    }
    else
    {
        SetFormPosition(childForm);
    }

    childForm.Show();
}

private void SetFormPosition(Form form)
{
    form.StartPosition = FormStartPosition.CenterScreen;
}

在上述代码中,OpenChildForm方法用于创建并显示子窗体。在创建子窗体之前,先设置子窗体的StartPosition属性为FormStartPosition.CenterScreen,表示在父窗体的中心打开。然后通过判断当前线程是否为UI线程来决定是否使用Invoke方法调用委托。

  1. 运行代码,子窗体将会在父窗体的中心打开。

需要注意的是,使用多线程时需要谨慎处理线程间的同步和访问共享资源的问题,以避免出现竞态条件和死锁等问题。

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

相关·内容

C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)

C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用) 看似一个简单的功能需求,其实很多初学者处理不好的,很多朋友会这么写: C# Code: //父窗体是是frmParent,子窗体是frmChildA...//在父窗体中打开子窗体 frmChildA child = new frmChildA(); child.MdiParent = this; child.Show(); //子窗体调父窗体方法...错在强依赖!如果父窗体与子窗体在同一个模块内看似没有错,因为这种反向引用在同一个模块内是可行的,但程序不能这么写,你把它写死了!固化了!...假设我们的项目不断在扩展,需要将父窗体与子窗体分开在不同的模块,这段代码就完了!因为父窗体模块必须引用子窗体模块,而子窗体需要用到frmParent的类,又要引用父窗体的模块!...办法是有的,就是使用接口解除依赖关系!

8.4K20
  • C#记事本项目开发,一个可以实现批量操作的记事本!【附源码】

    同样和之前大灰狼和大家分享的计算器项目一样,记事本项目也可以使用很多不同的语言开发,今天大灰狼就先和大家介绍一下使用C#开发记事本的思路和流程。...C#的记事本开发需要我们定义两个窗体,也就是一个承载所有记事本的父窗体,一个具有记事本基本功能的子窗体。 . 记事本子窗体 所以我们首先来聊一下具有记事本基本功能的子窗体的开发。...在C#的窗体应用中,我们可以直接对界面进行控件布局,不需要使用代码定义控件,在这一点上C#的窗体应用开发是很不错的。..., "警告"); } } 打开文件控件函数: 在进行文件的打开操作时,我们需要对所打开的文件进行筛选,只要求打开txt格式的文本文件即可。...主控页面父窗体 接下来就是承载记事本编辑窗口的父窗体了。 在父窗体中需要包括的控件有记事本的新建、关闭、全部关闭、退出等。

    2K10

    使用C++实现的仿Wallpaper动态壁纸软件(含源文件)

    在上一篇博客中,已经介绍了wallpaper的实现原理,并用C#实现,本文将使用C++和Qt框架实现,由于之前已经介绍过具体思路,本文将跳过分析过程,直接上代码。...Maneger,所以只要 //遍历所有workW类型的窗体,逐一比较它的父窗体是不是Program Manager就可以找到背景窗体 HWND hwnd = FindWindowA("...= NULL); return NULL; } 在C#制作动态壁纸软件时,我专门为刷新背景做了一个exe文件,因此这里可以直接调用 void ReFreshBackground(){ WinExec...("D:\\documents\\Wallpaper\\ReFreshBackground.exe",0); } 当我们点击“打开”按钮时,如果是第一次打开,需要新建窗体并设置为背景层窗体的子窗体,而之后就不用了...firstPlay){ ReFreshBackground(); } qApp->exit(0); } 在退出时也需要先判断是否打开了文件,如果没有打开,则不需要刷新壁纸

    1.5K10

    单件模式Singleton来控制窗体被重复或多次打开

    Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对Java的类 线程 内存等概念有相当的了解。...问题描述:用了单件模式Singleton来控制窗体被重复或多次打开,最初是在MDI子窗体中写方法,后来看别人的写的是属性,基本是一样的,都可以,然后想的是,项目中有诺多窗体,如果每个窗体都写一份,岂不太脑残...基类终于写好了,然后调试,发现确实可以控制窗体的打开个数,即被多次打开,但是呢,当窗体操作完成并关闭后,,再次打开这个窗体时就会出现(无法访问已释放的对象)的错误。...这里呢就有关系到C#中的垃圾回收问题。C#垃圾回收器管理所有的托管对象,所有需要托管数据的.NET语言(包括 C#)都受运行库的垃圾回收器的制约。...首先,窗体的重复或多次打开问题解决了;然后呢,每个窗体打开时,只要一行代码就搞定了,不用每个窗体写一份属性,方法(其实质还是借鉴Singleton);最后呢,不会出现再次打开不能访问的问题,即无法访问已释放的对象的问题

    1K20

    WinForm事件与消息

    消息概述以及在C#下的封装 Windows下应用程序的执行是通过消息驱动的。...在C#中,消息被应用程序的工作引擎通过轮询等方式遍历获取并按照消息的类型逐个分发到对应的组件(例如窗体、按钮等),最后调用对应组件所注册的事件进行处理。...例如,调用Run以启动当前线程上的应用程序消息循环,并可以选择使其窗体可见;调用Exit或ExitThread来停止消息循环。...} 因为Application是在单线程中运行的,所以在Application.Run开始后,Application本身不断轮询检查消息队列,然后根据消息类型进行数据分发。...窗体使用MouseClick事件中的函数指针调用已经添加的响应函数。所以C#中的事件字段实质上是一个函数指针列表,用来维护一些消息到达时的响应函数的地址。

    36020

    使用C#开发数据库应用程序

    string boolean bool 注意:C#中布尔类型的关键字与java不同,使用bool,C#中字符串数据类型是小写的。...鼠标双击事件,当用户双击窗体时发生 MouseMove 鼠标移动事件,当鼠标移过窗体时发生 KeyDown 键盘按下事件,在首次按下某个键时发生 KeyUp 键盘释放事件,在释放键时发生 例如...)创建MDI【设置父窗体:将父窗体的IsMDIContainer属性设为true。...设置子窗体:在调用打开子窗体的Show()方法前,在代码中将子窗体的MdiParent属性设为this】 例如: //用户单击菜单项时,出现创建学员用户窗口 private void tsmiNewStudent_Click...=this; addStudentForm.Show();//显示创建学员用户窗体 } (2)为父窗体添加子窗体列表【在父窗体中添加一个菜单Name(tsmiWindows),添加一个"窗口"菜单项

    5.9K30

    再议Windows消息与WinForm事件

    前言 在2月份的时候,我之前曾经写过一篇关于Windows消息与C# WinForm事件机制的文章,名为《WinForm事件与消息》。在那篇文章中,我简单探讨了一下事件和消息。...例如,调用Run以启动当前线程上的应用程序消息循环,并可以选择使其窗体可见;调用Exit或ExitThread来停止消息循环。...} 因为Application是在单线程中运行的,所以在Application.Run开始后,Application本身不断轮询检查消息队列,然后根据消息类型进行数据分发。...实际上整个过程应该如下: 当我们按下鼠标左键后,消息形成并送往应用程序消息队列中,然后被Application类从应用程序消息队列中取出,然后分发到相应的窗体。...窗体使用MouseClick事件中的函数指针调用已经添加的响应函数。所以C#中的事件字段实质上是一个函数指针列表,用来维护一些消息到达时的响应函数的地址。

    27510

    Wallpaper的原理和C#实现(含源文件)

    在主窗体的load事件里新建VideoForm。为了让VideoForm能够夹在图标层和背景层中间,需要将VideoForm的父窗体设置为背景窗体。...查找句柄 现在需要查找背景窗体的句柄,使用窗口查看器发现背景窗体没有窗体名称,因此无法直接定位,但是我们知道它的类名是WorkW,它的父窗体是Program Manager,所以我们可以遍历所有WorkW...窗体,如果其中一个窗体的父窗体是Program Manager,那么这个窗体就是背景窗体。...一旦返回空指针,会导致设置父窗体失败,最后视频会在图标层上方播放,此时的动态壁纸软件就彻底变成了一个全屏播放器。...这里利用了windows窗口的一个特性:如果A窗体在B窗体上面,那么A窗体也会在B窗体的子窗体上面。

    2.4K10

    C# 窗体常用API函数 应用程序窗体查找

    常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名空间...(即EnumWindows中lParam) 下面用一个例子对该方法说明 程序中要实现一个功能:可以在当前打开的窗体中找到目标窗体,并在需要时将其激活,置为前台窗体 using System;using...根据窗口标题查找的一般多用在多窗口的应用程序中,因为程序中的窗体标题固定,方便搜索。但要是对于系统中的一些窗体,例如记事本窗体,PPT等,窗体的标题是不定的,所以用窗口类搜索更方便。...如果用VC开发平台,可以使用其中的Spy快速的找到窗口的类型,在Spy++中有一个FindWindow工具,它允许你使用鼠标选择窗口,然后Spy++会显示这个窗口的类。...,当在其他线程中对当前线程窗体进行激活使用该方法是没有作用的。

    4K70

    c#实战教程_ps初学者入门视频

    (17) 修改formAbout属性StartPosition=CenterParent,表示打开对话框时,对话框在父窗口的中间。...两类对话框本质上都是窗体,是System.Windows.Forms.Form类的派生类,只是打开时使用的方法不一样,打开模式对话框,使用方法ShowDialog(),而打开非模式对话框,使用方法Show...(21) 修改formFindReplace窗体属性StartPosition=CenterParent,表示打开对话框时,对话框在父窗口的中间。...4.9.2 主窗口和子窗口的菜单的融合 在许多多文档编辑器应用程序中,在没有子窗体打开时,菜单比较简单,而有子窗体打开后,菜单增多。...实现这种功能一般是在主窗体中创建一个简单菜单,子窗体没打开时,只显示这个简单菜单。在子窗体中也创建一个菜单,包含主窗体菜单中没有的菜单项。

    15.7K10

    VB.NET窗体继承「建议收藏」

    VB.NET和C#都是完全面向对象的语言,而面向对象的三大特性是封装、继承、多态,出了在代码、功能上来体现,在设计窗体时是不是也可以用到呢?答案当然是YES!...如果一个程序中有多个界面相似,就可以考虑通过继承来实现,先建立一个父窗体,然后让子窗体来继承它,相同的代码就可以写在父窗体中,各自的功能分别写在不同的子窗体中,实现想要的功能。...(建好后需要重新生成解决方案) 2.选择项目菜单下的添加新项,在弹出的窗体中做如下选择: 3.选择“添加”按钮,在弹出的窗体中选择要继承的父窗体,点确定即可。...4.继承来的充值子窗体: 基本上已经完成了,但是会发现继承来的子窗体中的控件都是锁定的,如果想要通过这些控件添加一些新的功能,就需要将父窗体中的控件Modifiers属性设置为Public,这样就可以了...当我们做了很多重复的事情时,就应该停下来思考一下,有没有更好的方法。思想是行动的先导,首先要思考,然后再行动。

    82910

    利用委托实现winform多个窗体间的传值

    最近用C#做上位机程序开发,要实现这样一个功能: 父窗体创建了两个子窗体——子窗体1和子窗体2,子窗体1产生的数据要在子窗体2中显示出来。...因为这两个子窗体本身之间并没有直接关联,他们都是由父窗体new出来的,所以就想着1的数据先发给父窗体,父窗体再发给2。这样结构上比较清晰,也符合松耦合的模式。...子窗体1发送消息给父窗体 在子窗体1中定义一个委托 public delegate void SendMsg(string msg); 再定义一个事件 public event SendMsg send...,当我需要调用方法时可以直接调用委托,而事件是绑定到委托上的。...父窗体转发消息给子窗体2 这回等于是父窗体给子窗体发消息,所以我们在父窗体中定义委托和事件,然后让子窗体2去订阅,代码如下,我们先去掉关于窗体1的那部分以方便观察。

    1.7K31

    C#复习题 填空题

    在C#中,使用  const     关键字声明符号常量。 调用DataAdapter对象的 Fill()   方法填充数据集。...在C#中,根据打开的多个窗体之间是否存在相互制约关系,可将窗体的显示模式分为_ _模态_窗体和_ 非模态 __窗体。...在C#中,根据打开的多个窗体之间是否存在相互制约关系,可将窗体的显示模式分为 ( 模态  窗体和  非模态   )窗体。...NET使用 System.Data.SqlClient   命名空间的类访问SQL Server数据库中的数据。 窗体控件默认的事件是 加载事件     。...为打开文件“C:\Winnt\Win.txt”进行读写操作,首先应该创建 File    类的实例。 在NET中,用来与数据源建立连接的对象是 Connection对象     。

    4K10

    在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

    窗体的多线程一直是个难题,总是要出现奇奇怪怪的错误。...今天开发alexSEO软件时,出现了在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。...//BeginInvoke中只能放置操作控件的代码。BeginInvoke将子线程线程通过委托抛向UI主线程 。...,该窗体加载的时候会读取设备的数据,但会很耗时,为了防止窗体加载时候由于耗时的代码,导致不能及时的显示出来) frmGasBottlesInstall frmInstall = new frmGasBottlesInstall...当调试运行中突然关闭软件时,labb.Invoke(labchange);语句就出先了“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”错误。

    5.1K10

    .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体

    但是在企业级应用软件中业务需求可能更加复杂,如JS调用C#方法之后,需要访问宿主的窗体,设置窗体(WinForm、WPF、WinUI、Win32)中的控件等。...窗体中的 SetResultFromWeb() 方法 在普通的类中如访问一个窗体有两种方式 第一种是使用窗体类来实例化一个对象 Frm4JSCallWinForm form = new Frm4JSCallWinForm...(); 第二种方式直接使用窗体已经实例化之后的对象。...步骤3 在访问目标网页之前,通过webView2.CoreWebView2.AddHostObjectToScript()方法向网页中注入主机对象,其中第一个参数是自定义名称(随意命名),JS中访问主机对象时就需要与该参数名称一致...使用主机对象调用C#方法,由于调用过程是异步的,所以需要使用 await,方法定义前需要加上 async。 以上四步完成后即实现了JS访问窗体方法。

    2.5K40

    WPF自学入门(八)WPF窗体之间的交互

    接下来我们一起来实现窗体之间的传值,在父窗体上我们放两个控件,一个文本框TxtMessage,另一个是按钮BtnSend.子窗体上放一个文本框TxtInput。 父窗体的界面: ?...子窗体的界面: ? 要实现传值,我们首先要在子窗体中定义一个可读可写的公用的字符串:getMessage。然后在父窗体中按下按钮的时候,定义一个字符串Message,用来存放输入框的文字。...当然在我们写程序时,可能使用的就不只是单纯的传递一个值那么简单的。因为本人还刚接触到一个WPF项目,没有想过的场景。...这里我进行假设一个场景,依然还是有父子窗体,子窗体是父窗体中一个按钮的属性设置器,在子窗体中添上要设置属性的值,然后按设置完成,子窗体关闭,父窗体的相应按钮的属性也根据子窗体中的设置值而改变!...其实这里只是实现这个场景的一种方法,也是比较简单的方法,用到的知识是C#中的委托。这里演示一个最简单的例子: 下面看一下具体实现 在上一个例子中的子窗体新增一个按钮返回BtnReturn。

    2.5K10

    C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用

    在我的博客《C#开发BIMFACE系列52 CS客户端集成BIMFACE应用的技术方案》中介绍了多种集成BIMFACE到客户端程序中的方案。...允许开发者在.NET应用程序中嵌入Chromium。可以在C#或VB或任何其他CLR语言中使用。CefSharp同时提供WPF和WinForms Web浏览器控件实现。...(2)WinForm 窗体中输入 BIMFACE FileId,点击【加载模型/图纸】按钮,调用CefSahrp组件,加载步骤(1)中的网页。...定义一个单独的类,用于在CefSahrp组件加载网页之前,将其注入到网页中 (4)WinForm窗体中点击【 C# 调用 JS 方法】按钮。...当控件Dock属性设置为 Fill,客户端电脑的缩放与布局不是100%时,窗体呈现黑边(严重bug),并没有完全填充父容器。 《BIMFace.SDK.CSharp》开源SDK。

    2.5K40

    C# SplitContainer 控件详细用法

    使用 SplitContainer 控件,可以创建复合的用户界面(通常,在一个面板中的选择决定了在另一个面板中显示哪些对象)。这种排列对于显示和浏览信息非常有用。...在下面的代码示例中,在窗体的 Load 事件中将 SplitContainer 控件中的拆分器设置为拖动时跳过 10 个像素。...C# this.Load += new System.EventHandler(this.Form1_Load); 3.如何:水平拆分窗口水平拆分窗口 在程序中,将 SplitContainer...,将创建一个类似于在 Microsoft Outlook 中使用的多窗格用户界面,该界面中包含“文件夹列表”、“邮件”窗格和“预览”窗格。...这种排列主要是通过在窗体上停靠控件实现的。在停靠控件时,可以确定控件要紧靠父容器的哪个边缘。这样,如果将 Dock 属性设置为 Right,控件的右边缘将停靠在它的父控件的右边缘。

    2.9K30

    FindWindowEx使用方法「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。 功能:这个函数获取窗口句柄。类名和窗体名称和给定的字符串匹配形式。这个功能看起来子窗体,从在一个给定的子窗体子窗体回到下一个起始行。...LPCTSTR lpszClass,LPCTSTR lpszWindow); 參数: hwndParent:要查找子窗体的父窗体句柄。...函数仅查找全部消息窗体。 hwndChildAfter :子窗体句柄。查找从在Z序中的下一个子窗体開始。 子窗体必须为hwndPareRt窗体的直接子窗体而非后代窗体。...查找从hwndParent的第一个子窗体開始。假设hwndParent 和 hwndChildAfter同一时候为NULL。则函数查找全部的顶层窗体及消息窗体。...C#中使用该函数首先导入命名空间: using System.Runtime.InteropServices; 然后写API引用部分的代码,放入 class 内部 [DllImport(“user32

    1.7K20
    领券