vs2010中,c#的wpf添加一个自定义控件后,在编辑器中(不是编译后)会执行代码,如Messagebox

zpc38368330 2017-04-18 11:32:57
如下操作:(不算打开VS2010的时间,最多两分钟搞出这个问题)
1.随便创建一个wpf的程序
2.然后添加一个wpf的usercontrol控件
3.在新添加的usercontrol控件的构造函数中加入一Messagebox.show("...:");如下代码(高手直接复制过去,省的自己写了)
public UserControl1()
{
InitializeComponent();
MessageBox.Show("tmd");
}
4,先生成一下程序,要不然有时会找不到自定的Usercontrol控件
5,然后在主窗口中将新的Usercontrol控件从工具栏中拖到主窗口中
神奇的事出现了,我没有运行程序,但是 vs2010却弹出了一个Messagebox "tmd" .
6;.可将主窗口的视图编辑文档关闭,然后再通过解决方案资源管理器将其打开,然后这个 tmd 又出现了

我当然不会无聊到加一个Messagebox.show在Usercontrol的构造函数中,但是我这里确实需要执行一些代码(在程序运行时),然而因为在视图编辑时,wpf会自动运行下Usercontrol1()的构造函数,造成我需要在运行时才会有效的一些代码在这里无效,从而让视图编辑器直接罢工,说我需要解决XXX为NULL等等的问题.
我的本意是在控件加载后,需要初始化或修改一些变量,仅在控件有效期内执行一次即可,貌似只能在构造函数或是UserControl_Initialized事件中执行,其余的事件如loaded会因为切换窗口,如TabControl控件的标签切换,被触发多次loaded.这不是我想要的效果
请问这个问题应该怎么解决?
...全文
218 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpc38368330 2017-04-19
  • 打赏
  • 举报
回复
引用 3 楼 Forty2 的回复:
倒是可以检测设计时和运行时:
public UserControl1()
{
  InitializeComponent();
  if (DesignerProperties.GetIsInDesignMode(this) == false) //
  {
    MessageBox.Show("tmd");
  }
}
谢谢,完美解决问题~
stherix 2017-04-19
  • 打赏
  • 举报
回复
在默认构造函数里不要写逻辑代码 只写与控件本身初始化的内容,因为界面设计器也需要调用这个构造函数 你可以新建一些带参数的构造函数,里面可以随便写任何代码,你到时候可以调用这些
Forty2 2017-04-19
  • 打赏
  • 举报
回复
倒是可以检测设计时和运行时:
public UserControl1()
{
  InitializeComponent();
  if (DesignerProperties.GetIsInDesignMode(this) == false) //
  {
    MessageBox.Show("tmd");
  }
}
zpc38368330 2017-04-19
  • 打赏
  • 举报
回复
引用 1 楼 xuggzu 的回复:
tab控件自身loaded(非page)也只会一次,哪有多次?
我是在tab控件中的一个标签内拖入一个usercontrol控件,然后,在这个usercontrol控件内响应loaded事件,刚才又确认了下,每切换回这个有usercontrol的标签时,usercontrol控件内部会触发一次loaded事件.
xuggzu 2017-04-19
  • 打赏
  • 举报
回复
tab控件自身loaded(非page)也只会一次,哪有多次?

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧