c# mdi父子窗口,传值问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# mdi父子窗口,传值问题相关的知识,希望对你有一定的参考价值。

我在父窗口里面加入了一个statusStrip.在这个里面加入了一个toolstripstatuslabel.
我想在子窗口load的时候写入这个toolstripstatuslabel.TEXT做为状态.如"正在打开.当前进度40%"
我试了几个方法.可是每一次都是在子窗口show了之后变化,并只显示了最后的那个TEXT.有什么好的方法么.我之前用的是属性.后来改成委托,都是只显示最后那一个状态.中间所有的状态都没有显示.

如果没有用多线程处理,那么主线程在执行代码的时候,会被阻塞,一直到代码全部执行完毕,界面才有响应,从而造成你说的只显示最后的状态
要在多线程里执行代码,并修改Text,注意这个Text也要通过Invoke调用
参考技术A 因为代码执行的太快了,还没来得及显示就已经到最后了,如果非要显示进度的效果..

可以用线程或者timer控件来暂停一下程序..追问

应该不是吧.第一我的窗口打开要差不多2秒多.他只有在子窗体跳出的时候才变化.
第二,我程序调试到赋值之后.界面上一直没有变化.

参考技术B 改用多线程!因为在执行子窗口显示的过程中没法去实时刷新父窗口的ToolStripStatusLabel的显示内容!

一张图说清楚Vue3父子组件传值,以及props可否改的本质问题

参考技术A 为了避免混淆,先介绍一下后端语言用的类。
一般类可以包含内部成员、属性、方法、事件等。
内部成员一般都是私有的(其实也可以设置为公有),调用者不可以直接访问内部成员,而是要通过属性来访问内部成员。

属性是内部成员的安全通道,可以限制访问方式,比如只读;也可以设置关卡,比如年龄 > 18 且 年龄 < 60的才可以通过。

vue 的组件,也可以设置 data、props、computed、methods等,看起来和类的设置很像,但是却有着本质的区别。

所以请不要把类的理解和使用方式,生硬的套在 vue 的父子组件上面,要注意区分。

现在来讨论一下,props 到底可不可以改的问题。

按照官网的说法,子组件是不可以修改 props 的,原因云云,于是好多人也跟着说不能改,改了就云云。

那么本质原因是啥呢?知其然还要知其所以然!

这个要从js的数据类型说起,js的类型比较乱,有很多种划分方式,从传递的角度来看,可以分为传值类型和引用类型。

对于传值类型,传递副本之后,副本和“本尊”已经没有任何联系了,副本随便改,都不会影响“本尊”。

引用类型,传递的是自己的地址(指针),所以可以通过地址修改“本尊”的属性,这样改副本就可以影响到“本尊”。

vue组件的 props 能改与不能改,就是这两种传递方式导致的。

我们经常用到组件的 props,那么 props 到底是什么样子的呢?

这里以 Vue3 为例来分析一下,我们设置一个简单的父子组件,设置几种常见的类型:

子组件定义一个 props,有基础类型,和引用类型几个成员。基础类型需要使用 emit 来修改,引用类型(reactive),可以直接通过 proxy 的拦截原理来方向修改。

模板:

js:

父组件定义几个类型的data传递给子组件。基础类型用 ref,引用类型使用 reactive。因为这样可以有响应性。

我们先来看看 props 的打印结果,发现是一个套娃 proxy:

在 vue3 里面,reactive、shallowReactive、readonly、shallowReadonly 都用了proxy,那么到底是哪一种呢?

简单测试一下就会发现是 shallowReadonly(浅层只读),那么问题来了,既然不让改,为啥不用 readonly?是遗漏了吗?

我猜测这是一个平衡各种需求后的折中处理方案。

然后可能官方为了避免心智负担,于是干脆一刀切,就说不让改props,这样就省事了。

而对于懂得原理的,那就可以传递引用类型,实现更简洁的操作方式。

上图比较清晰的表达了数据的流向。

一个常见的例子就是,“弹窗显示表单”。以element-plus 为例:

父组件:

子组件

模板

这样父组件和子组件都可以轻松的控制 el-dialog 了。

以上是关于c# mdi父子窗口,传值问题的主要内容,如果未能解决你的问题,请参考以下文章

VC++ 非 mfc 中的父子窗口问题

利用CWinThread实现跨线程父子MFC窗口

js弹窗,父子窗口调用

父子组件传值props

父子窗口

javascript_父子窗口交互_资料