首页 新闻 会员 周边 捐助

C#正确移除用户控件的方式

0
悬赏园豆:5 [待解决问题]

代码背景:我写了用户控件A和用户控件B(即自定义控件),再利用一个panel容器来回切换这两个用户控件。其中用户控件A在创建时会打开一个计时器Timer,计时器是每隔2s弹框显示一个信息。
注释:来回切换意思是,清除控件A,添加控件B。
问题出现:当打开A时,然后再切换B,计时器事件仍然执行!
疑问:
如何做到在切换B的时候,停止A的计时器,有没有A被清除的时候,会触发的一个事件?或者提一个代码思路。

😀明笔记的主页 😀明笔记 | 初学一级 | 园豆:13
提问于:2021-06-08 11:25
< >
分享
所有回答(4)
0

切换的时候 不要清除掉组件 更改他的visible 在有timer的组件里 登记visiblechanged事件 隐藏的时候 stop 这个timer

彭小立 | 园豆:634 (小虾三级) | 2021-06-08 13:39

我这里只是举例只有A,B。后续是有很多的,而且不断添加可以切换的用户控件,所以我是需要清除的。有没有可以清除,又可以停止的方法?

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2021-06-08 13:59
0

首先自定义一个事件。
然后在自定义控件中实现这个事件,事件实现方法中停止自身的定时器。
最后,在切换控件显示时,手动触发这个事件。

leslie_xin | 园豆:404 (菜鸟二级) | 2021-06-08 14:09

这样实现的话,存在一个问题:每次切换都会残留这个订阅对象,如何在清理控件的时候,取消这个订阅呢?

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2021-06-08 14:15

@😀明笔记: 对控件而言,在初始化时绑定事件,是不会出现残留的。

支持(0) 反对(0) leslie_xin | 园豆:404 (菜鸟二级) | 2021-06-08 14:19

@leslie_xin: 比如说:订阅事件的发生方法是【弹框显示“OK”】,我在A控件初始化时就订阅这个方法。如果清除,切换到B控件时,此时触发的话,仍然会【弹框显示“OK”】

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2021-06-08 14:22

@😀明笔记: 这个描述有点看不懂,你贴下代码年看。

支持(0) 反对(0) leslie_xin | 园豆:404 (菜鸟二级) | 2021-06-08 14:35

@leslie_xin:
代码太多又凌乱,写个思路代码:
public class ClassA{
public event EventHandler ChangeCodeEvent;
//类里面有一个TCP,通过外部触发这个事件发生
}
public class ucMainPage : UserControl
{
public ucMainPage(ClassA CA)
{
InitializeComponent();
//初始化就订阅事件
CA.ChangeCodeEvent += Show(XXX,XX)
}

public void Show(XX,XX)
{
//弹框显示OK
}
}
//切换其他用户控件时,仍然触发会弹框显示“OK”

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2021-06-08 14:43

@😀明笔记: 仅从你这些代码,你可以试下这样可不可以解决。
先ChangeacodeEvent -=Show
再ChangeacodeEvent +=Show

支持(0) 反对(0) leslie_xin | 园豆:404 (菜鸟二级) | 2021-06-08 14:51

@leslie_xin: 仍然会触发啊,在清除用户控件时没有-=,弹框就会一直出现

支持(0) 反对(0) 😀明笔记 | 园豆:13 (初学一级) | 2021-06-08 14:53

@😀明笔记: (●—●)你还是写个小demo,然后贴下代码吧。

支持(0) 反对(0) leslie_xin | 园豆:404 (菜鸟二级) | 2021-06-08 15:05
0

用wpf的方法把ObservableCollection
ObservableCollection<controls> collection=new..
collection.OnCollectionChanged+=(NotifyCollectionChangedAction action, IList newItems, IList oldItems)=>{

for(.changedItem.)
{
if(changedItem[i] is ControlA)
{
(changedItem[i] as ControlA).Timer.Stop();
}
}

for(.newItems.)
{
if(newItems[i] is ControlA)
{
(changedItem[i] as ControlA).Timer.Start();
}
}

}

大概这么意思,通过这个集合当媒介

猝不及防 | 园豆:2882 (老鸟四级) | 2021-06-08 20:36
0

这种场景我遇到过,实现控件的Control.ParentChanged 事件处理程序,检测到控件的父容器变成null时停止定时器,不为null时开启定时器。如果还不明白的话,你可以写小demo,我来帮你改

二次元攻城狮 | 园豆:462 (菜鸟二级) | 2021-07-25 10:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册