Invoke(Delegate)的用法:

  1. //例如,要实时update窗体。如果在另一个线程中update,那么可以直接update(可以不在新线程中);也可以在Delegate中给出upate,然后invoke调用(但是invoke必须在另一线程中)
  2. //区别在于invoke是同步的(在此处,同步是啥意思)
  3. //参数Delegate拥有某个窗体句柄的控制权,即Delegate是在窗体类中定义的 —— 故update操作应在Delegate中
  4. //invoke应该在另一个线程中调用;返回值为Delegate的返回值
  5. class MyFormControl : Form
  6. {
  7. public delegate void AddListItem();
  8. public AddListItem myDelegate;
  9. private Thread myThread;
  10.  
  11. public MyFormControl()
  12. {
  13. myDelegate = new AddListItem(AddListItemMethod);
  14.  
  15. myThread = new Thread(new ThreadStart(ThreadFunction));
  16. myThread.Start();
  17. }
  18. public void AddListItemMethod()
  19. {
  20. //update
  21. }
  22. private void ThreadFunction()
  23. {
  24. MyThreadClass myThreadClassObject = new MyThreadClass(this);
  25. myThreadClassObject.Run();
  26. }
  27. }
  28. class MyThreadClass
  29. {
  30. MyFormControl myFormControl1;
  31. public MyThreadClass(MyFormControl myForm)
  32. {
  33. myFormControl1 = myForm;
  34. }
  35. public void Run()
  36. {
  37. myFormControl1.Invoke(myFormControl1.myDelegate);
  38. //myFormControl1.myDelegate();
  39. }
  40. }

主要采用纯手写代码,生成窗体界面的方式(偶尔也可能拖控件)。

空工程创建一个窗体(但是现在是先弹出控制台——想办法去掉):

  1. using System.Drawing;
  2. using System.Windows.Forms;
  3.  
  4. namespace Project1
  5. {
  6. class MyFormControl : Form
  7. {
  8. public MyFormControl()
  9. {
  10. ClientSize = new Size(, );
  11. Text = "Custom Widget";
  12. }
  13. static void Main()
  14. {
  15. MyFormControl myForm = new MyFormControl();
  16. myForm.ShowDialog();
  17. }
  18. }
  19. }

Button的创建及响应事件(下面的就不AddRange了):

  1. //基于刚才的工程,在构造函数中新建一个button
  2. //Location、Size、TabIndex、Text、EventHandler
  3. myButton = new Button();
  4. myButton.Location = new Point(, );
  5. myButton.Size = new Size(, );
  6. myButton.TabIndex = ;
  7. myButton.Text = "Add items in list box";
  8. myButton.Click += new EventHandler(Button_Click);
  9.  
  10. Controls.AddRange(new Control[] { myButton });

ListBox的创建及用法:

  1. myListBox = new ListBox();
  2. myListBox.Location = new Point(, );
  3. myListBox.Name = "myListBox";
  4. myListBox.Size = new Size(, );
  5. myListBox.TabIndex = ;
  6.  
  7. //添加项
  8. string myItem = "";
  9. myListBox.Items.Add(myItem);
  10. myListBox.Update();

C# widget的更多相关文章

  1. StructureMap 代码分析之Widget 之Registry 分析 (1)

    说句实话,本人基本上没用过Structuremap,但是这次居然开始看源码了,不得不为自己点个赞.Structuremap有很多的类,其中有一个叫做Widget的概念.那么什么是Widget呢?要明白 ...

  2. Sencha ExtJS 6 Widget Grid 入门

    最近由于业务需要,研究了一下Sencha ExtJS 6 ,虽然UI和性能上据相关资料说都有提升,但是用起来确实不太顺手,而且用Sencha cmd工具进行测试和发布,很多内部细节都是隐藏的,出了问题 ...

  3. 使用 CoordinatorLayout 出错 inflating class android.support.design.widget.CoordinatorLayout

    ava.lang.RuntimeException: Unable to start activity ComponentInfo{com.czr.ianpu/com.czr.ianpu.MainAc ...

  4. yii2——自定义widget

    参考资料:http://www.bsourcecode.com/yiiframework2/how-to-create-custom-widget-in-yii2-0-framework/   如何使 ...

  5. Yii2 时间控件之把layDate做成widget

    实现效果如下 1.把layDate封装成Yii2的widget,存在 "\common\widgets"目录下,命名为DycLayDate,具体引用查看代码. 2.对应的model ...

  6. 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题

    解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题http ...

  7. Ext.js细节:在MVC中处理Widget Column,GetCmp和ComponentQuery, Id和ItemId

    针对EXT.JS版本的演进,要不断的学习新的最佳实践方法. 比如,在定义组件时,尽管用itemid,而不是id. 在搜索组件时,尽量用ComponentQuery,而不是getCmp. 在MVC中处理 ...

  8. App Widget简单应用

    首先后台进程创建一个PendingIntent对象,其中PendingIntent中包含一个真正的Intent,创建完成后将此PendingIntent对象交给桌面控件所在的进程,当用户点击桌面控件或 ...

  9. App Widget

    AppWidgetProviderInfo对象: 为App Widget提供元数据(描述数据的数据,如XML.关系型数据的表结构),包括布 局,更新频率等数据.这个对象被定义在XML文件当中: App ...

  10. android应用开发(十):widget的使用

    1.自定义widget必须继承AppWidgetProvider 源码:http://www.jinhusns.com/Products/Download/?type=xcj 2.AndroidMan ...

随机推荐

  1. CXF框架入门(重点)

    l CXF是一个开源的webservice框架 l CXF支持的协议:SOAP.XML/HTTP等 l CXF可以很好的和spring集成 l CXF可以部署到tomcat.jboss.jetty等服 ...

  2. eclipse 依赖别的 工程 断点进不去

    maven Debug 发现进不了断点. 点击右键-->Properties-->Java Compiler-->Classfile Generation, 勾选上Add line  ...

  3. mysql-day06

    ##视图 - 什么是视图:在数据库中存在多种对象,表和视图都是数据库中的对象,创建视图时名称不能和表重名,视图实际上就代表一段sql查询语句,也可以理解成视图是一张虚拟的表,此虚拟表中的数据会随着原表 ...

  4. QMenu 设置菜单图标 & 生成菜单树

    效果图 源码 .h 文件 protected slots: void onMenuTriggered(QAction*); .cpp 文件 // 菜单 QMenu *pMenu = new QMenu ...

  5. Shell生成数字序列

    转自http://kodango.com/generate-number-sequence-in-shell Shell里怎么输出指定的数字序列: for i in {1..5}; do echo $ ...

  6. kivy 使用webview加载网页

    from kivy.app import App from kivy.uix.widget import Widget from kivy.clock import Clock from jnius ...

  7. php 网站中文简体繁体转换类

    php 网站中文简体繁体转换类 <?php /* * define zh convert functions * 2017-4-28 use str_replace for speed * zh ...

  8. Android之扫描文件或文件夹

    我们或许经常会遇到这种情况,明明保存了图片,但是当你打开图片时,却没有找到这张图片,手机重启之后才能看到.这是因为SD卡并没有重新挂载,图库也无法把这张图片加载进去,解决这个问题非常简单,只需要我们重 ...

  9. kaggle竞赛_mnist_10%

      主要是通过mnist了解kaggle的操作细节,最终这里的结果为: 引入必须的库¶ import pandas as pd import numpy as np import matplotlib ...

  10. 学习Struts2的个人疑惑及问题解决

    刚开始学习SSH框架中Struts2时,个人疑惑以及一些问题总结一下. 1.package节点namespace属性值决定访问路径问题       namespace不写或写namespace=&qu ...