前言

在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作。不过会有一个问题:就是涉及到跨线程操作UI元素。

相信才开始接触的人一定会遇上这个问题。

为了解决这个问题,可以通过委托来实现。

我为了后期使用更加方便,就将常用的几个控件(TextBox、Label、CheckBox、RadioButton、ProgressBar)UI操作进行了封装,源码可以在github上查看:GitHub仓库地址

源码在github仓库中的XY.WINUI.ControlEx.InvokeEx文件夹中

使用示例

在测试项目中有使用的方法,这里只做简单介绍。

调用方法在Invokes类中,也可以使用单独的类调用。

例如:在窗体中为tbName的TextBox设置和获取值

  1. //首先,使用命名空间
  2. using XY.WINUI.ControlEx.InvokeEx;
  3. //第一种
  4. //设置TextBox的值
  5. Invokes.SetTextBoxText(tbName,"TextBox文本");
  6. //获取TextBox的值
  7. string value = Invokes.GetTextBoxText(tbName);
  8. //第二种
  9. //设置TextBox的值
  10. TextBoxInvoke.SetTextBoxText(tbName,"TextBox文本");
  11. //获取TextBox的值
  12. string value = TextBoxInvoke.GetTextBoxText(tbName);

GitHub源码

帮助类源码

集合类(Invokes.cs)

Invokes.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. namespace XY.WINUI.ControlEx.InvokeEx
  6. {
  7. public class Invokes
  8. {
  9. #region //Controls
  10. #region // TextBox
  11. /// <summary>
  12. /// 设置文本框文本
  13. /// </summary>
  14. /// <param name="Ctrl"></param>
  15. /// <param name="Text"></param>
  16. public static void SetTextBoxText(TextBox Ctrl, string Text)
  17. {
  18. TextBoxInvoke.SetTextBoxText(Ctrl, Text);
  19. }
  20. /// <summary>
  21. /// 获取文本框文本方法
  22. /// </summary>
  23. /// <param name="Ctrl"></param>
  24. public static string GetTextBoxText(TextBox Ctrl)
  25. {
  26. return TextBoxInvoke.GetTextBoxText(Ctrl); ;
  27. }
  28. #endregion
  29. #region // Label
  30. /// <summary>
  31. /// 设置标签文本
  32. /// </summary>
  33. /// <param name="Ctrl"></param>
  34. /// <param name="Text"></param>
  35. public static void SetLabelText(Label Ctrl, string Text)
  36. {
  37. LabelInvoke.SetLabelText(Ctrl, Text);
  38. }
  39. /// <summary>
  40. /// 获取标签文本方法
  41. /// </summary>
  42. /// <param name="Ctrl"></param>
  43. public static string GetLabelText(Label Ctrl)
  44. {
  45. return LabelInvoke.GetLabelText(Ctrl); ;
  46. }
  47. #endregion
  48. #region // RadioButton
  49. /// <summary>
  50. /// 获取单选按钮选中状态
  51. /// </summary>
  52. /// <param name="Ctrl"></param>
  53. /// <returns></returns>
  54. public static bool GetRadioButtonChecked(RadioButton Ctrl)
  55. {
  56. return RadioButtonInvoke.GetRadioButtonChecked(Ctrl);
  57. }
  58. /// <summary>
  59. /// 设置单选按钮选中状态
  60. /// </summary>
  61. /// <param name="Ctrl"></param>
  62. /// <param name="Checked"></param>
  63. public static void SetRadioButtonChecked(RadioButton Ctrl, bool Checked)
  64. {
  65. RadioButtonInvoke.SetRadioButtonChecked(Ctrl, Checked);
  66. }
  67. #endregion
  68. #region // CheckBox
  69. /// <summary>
  70. /// 获取选择按钮选中状态
  71. /// </summary>
  72. /// <param name="Ctrl"></param>
  73. /// <returns></returns>
  74. public static bool GetCheckBoxChecked(CheckBox Ctrl)
  75. {
  76. return CheckBoxInvoke.GetCheckBoxChecked(Ctrl);
  77. }
  78. /// <summary>
  79. /// 设置选择按钮选中状态
  80. /// </summary>
  81. /// <param name="Ctrl"></param>
  82. /// <param name="Checked"></param>
  83. public static void SetCheckBoxChecked(CheckBox Ctrl, bool Checked)
  84. {
  85. CheckBoxInvoke.SetCheckBoxChecked(Ctrl, Checked);
  86. }
  87. #endregion
  88. #region // ProgressBar
  89. /// <summary>
  90. /// 获取进度条值
  91. /// </summary>
  92. /// <param name="Ctrl"></param>
  93. public static int GetProgressBarValue(ProgressBar Ctrl)
  94. {
  95. return ProgressBarInvoke.GetProgressBarValue(Ctrl);
  96. }
  97. /// <summary>
  98. /// 设置进度条值
  99. /// </summary>
  100. /// <param name="Ctrl"></param>
  101. /// <param name="Value"></param>
  102. public static void SetProgressBarValue(ProgressBar Ctrl, int Value)
  103. {
  104. ProgressBarInvoke.SetProgressBarValue(Ctrl, Value);
  105. }
  106. /// <summary>
  107. /// 获取进度条最小值
  108. /// </summary>
  109. /// <param name="Ctrl"></param>
  110. public static int GetProgressBarMinValue(ProgressBar Ctrl)
  111. {
  112. return ProgressBarInvoke.GetProgressBarMinValue(Ctrl);
  113. }
  114. /// <summary>
  115. /// 设置进度条最小值
  116. /// </summary>
  117. /// <param name="Ctrl"></param>
  118. /// <param name="Value"></param>
  119. public static void SetProgressBarMinValue(ProgressBar Ctrl, int Value)
  120. {
  121. ProgressBarInvoke.SetProgressBarMinValue(Ctrl, Value);
  122. }
  123. /// <summary>
  124. /// 获取进度条最大值
  125. /// </summary>
  126. /// <param name="Ctrl"></param>
  127. public static int GetProgressBarMaxValue(ProgressBar Ctrl)
  128. {
  129. return ProgressBarInvoke.GetProgressBarMaxValue(Ctrl);
  130. }
  131. /// <summary>
  132. /// 设置进度条最大值
  133. /// </summary>
  134. /// <param name="Ctrl"></param>
  135. /// <param name="Value"></param>
  136. public static void SetProgressBarMaxValue(ProgressBar Ctrl, int Value)
  137. {
  138. ProgressBarInvoke.SetProgressBarMaxValue(Ctrl, Value);
  139. }
  140. #endregion
  141. #endregion
  142. #region // Common
  143. #region // Visible
  144. /// <summary>
  145. /// 获取控件是否可见委托
  146. /// </summary>
  147. /// <param name="Ctrl"></param>
  148. private delegate bool GetControlVisibleDelegate(Control Ctrl);
  149. /// <summary>
  150. /// 设置控件是否可见委托
  151. /// </summary>
  152. /// <param name="Ctrl"></param>
  153. /// <param name="Visible"></param>
  154. private delegate void SetControlVisibleDelegate(Control Ctrl, bool Visible);
  155. /// <summary>
  156. /// 获取控件是否可见方法
  157. /// </summary>
  158. /// <param name="Ctrl"></param>
  159. private static bool GetControlVisibleFunc(Control Ctrl)
  160. {
  161. return Ctrl.Visible;
  162. }
  163. /// <summary>
  164. /// 获取控件是否可见
  165. /// </summary>
  166. /// <param name="flag"></param>
  167. public static bool GetControlVisible(Control Ctrl)
  168. {
  169. return (bool)Ctrl.Invoke(new SetControlVisibleDelegate(SetControlVisibleFunc), new object[] { Ctrl });
  170. }
  171. /// <summary>
  172. /// 设置控件是否可见方法
  173. /// </summary>
  174. /// <param name="Ctrl"></param>
  175. /// <param name="Visible"></param>
  176. private static void SetControlVisibleFunc(Control Ctrl, bool Visible)
  177. {
  178. Ctrl.Visible = Visible;
  179. Ctrl.Refresh();
  180. }
  181. /// <summary>
  182. /// 设置控件是否可见
  183. /// </summary>
  184. /// <param name="Ctrl"></param>
  185. /// <param name="Visible"></param>
  186. public static void SetControlVisible(Control Ctrl, bool Visible)
  187. {
  188. Ctrl.Invoke(new SetControlVisibleDelegate(SetControlVisibleFunc), new object[] { Ctrl, Visible });
  189. }
  190. #endregion
  191. #endregion
  192. }
  193. }

文本框(TextBox)

TextBoxInvoke.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. namespace XY.WINUI.ControlEx.InvokeEx
  6. {
  7. /// <summary>
  8. /// TextBoxInvoke
  9. /// </summary>
  10. public class TextBoxInvoke
  11. {
  12. /// <summary>
  13. /// 获取文本框文本委托
  14. /// </summary>
  15. /// <param name="Ctrl"></param>
  16. private delegate string GetTextBoxTextDelegate(TextBox Ctrl);
  17. /// <summary>
  18. /// 设置文本框文本委托
  19. /// </summary>
  20. /// <param name="Ctrl"></param>
  21. /// <param name="Text"></param>
  22. private delegate void SetTextBoxTextDelegate(TextBox Ctrl, string Text);
  23. /// <summary>
  24. /// 获取文本框文本方法
  25. /// </summary>
  26. /// <param name="Ctrl"></param>
  27. private static string GetTextBoxTextFunc(TextBox Ctrl)
  28. {
  29. return Ctrl.Text;
  30. }
  31. /// <summary>
  32. /// 获取文本框文本
  33. /// </summary>
  34. /// <param name="Ctrl"></param>
  35. /// <returns></returns>
  36. public static string GetTextBoxText(TextBox Ctrl)
  37. {
  38. return (string)Ctrl.Invoke(new GetTextBoxTextDelegate(GetTextBoxTextFunc), new object[] { Ctrl });
  39. }
  40. /// <summary>
  41. /// 设置文本框文本方法
  42. /// </summary>
  43. /// <param name="Ctrl"></param>
  44. /// <param name="Text"></param>
  45. private static void SetTextBoxTextFunc(TextBox Ctrl, string Text)
  46. {
  47. Ctrl.Text = Text;
  48. Ctrl.Refresh();
  49. }
  50. /// <summary>
  51. /// 设置文本框文本
  52. /// </summary>
  53. /// <param name="Ctrl"></param>
  54. /// <param name="Text"></param>
  55. public static void SetTextBoxText(TextBox Ctrl, string Text)
  56. {
  57. Ctrl.Invoke(new SetTextBoxTextDelegate(SetTextBoxTextFunc), new object[] { Ctrl, Text });
  58. }
  59. }
  60. }

标签(Label)

LabelInvoke.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. namespace XY.WINUI.ControlEx.InvokeEx
  6. {
  7. /// <summary>
  8. /// LabelInvoke
  9. /// </summary>
  10. public class LabelInvoke
  11. {
  12. /// <summary>
  13. /// 获取标签文本委托
  14. /// </summary>
  15. /// <param name="Ctrl"></param>
  16. private delegate string GetLabelTextDelegate(Label Ctrl);
  17. /// <summary>
  18. /// 设置标签文本委托
  19. /// </summary>
  20. /// <param name="Ctrl"></param>
  21. /// <param name="Text"></param>
  22. private delegate void SetLabelTextDelegate(Label Ctrl, string Text);
  23. /// <summary>
  24. /// 获取标签文本方法
  25. /// </summary>
  26. /// <param name="Ctrl"></param>
  27. private static string GetLabelTextFunc(Label Ctrl)
  28. {
  29. return Ctrl.Text;
  30. }
  31. /// <summary>
  32. /// 获取标签文本
  33. /// </summary>
  34. /// <param name="Ctrl"></param>
  35. /// <returns></returns>
  36. public static string GetLabelText(Label Ctrl)
  37. {
  38. return (string)Ctrl.Invoke(new GetLabelTextDelegate(GetLabelTextFunc), new object[] { Ctrl });
  39. }
  40. /// <summary>
  41. /// 设置标签文本方法
  42. /// </summary>
  43. /// <param name="Ctrl"></param>
  44. /// <param name="Text"></param>
  45. private static void SetLabelTextFunc(Label Ctrl, string Text)
  46. {
  47. Ctrl.Text = Text;
  48. Ctrl.Refresh();
  49. }
  50. /// <summary>
  51. /// 设置标签文本
  52. /// </summary>
  53. /// <param name="Ctrl"></param>
  54. /// <param name="Text"></param>
  55. public static void SetLabelText(Label Ctrl, string Text)
  56. {
  57. Ctrl.Invoke(new SetLabelTextDelegate(SetLabelTextFunc), new object[] { Ctrl, Text });
  58. }
  59. }
  60. }

复选框(CheckBox)

CheckBoxInvoke.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. namespace XY.WINUI.ControlEx.InvokeEx
  6. {
  7. /// <summary>
  8. /// CheckBoxInvoke
  9. /// </summary>
  10. public class CheckBoxInvoke
  11. {
  12. /// <summary>
  13. /// 获取选择按钮选中状态委托
  14. /// </summary>
  15. /// <param name="Ctrl"></param>
  16. private delegate bool GetCheckBoxCheckedDelegate(CheckBox Ctrl);
  17. /// <summary>
  18. /// 设置选择按钮选中状态委托
  19. /// </summary>
  20. /// <param name="Ctrl"></param>
  21. /// <param name="Checked"></param>
  22. private delegate void SetCheckBoxCheckedDelegate(CheckBox Ctrl, bool Checked);
  23. /// <summary>
  24. /// 获取选择按钮选中状态方法
  25. /// </summary>
  26. /// <param name="Ctrl"></param>
  27. private static bool GetCheckBoxCheckedFunc(CheckBox Ctrl)
  28. {
  29. return Ctrl.Checked;
  30. }
  31. /// <summary>
  32. /// 获取选择按钮选中状态
  33. /// </summary>
  34. /// <param name="Ctrl"></param>
  35. /// <returns></returns>
  36. public static bool GetCheckBoxChecked(CheckBox Ctrl)
  37. {
  38. return (bool)Ctrl.Invoke(new GetCheckBoxCheckedDelegate(GetCheckBoxCheckedFunc), new object[] { Ctrl });
  39. }
  40. /// <summary>
  41. /// 设置选择按钮选中状态方法
  42. /// </summary>
  43. /// <param name="Ctrl"></param>
  44. /// <param name="Checked"></param>
  45. private static void SetCheckBoxCheckedFunc(CheckBox Ctrl, bool Checked)
  46. {
  47. Ctrl.Checked = Checked;
  48. Ctrl.Refresh();
  49. }
  50. /// <summary>
  51. /// 设置选择按钮选中状态
  52. /// </summary>
  53. /// <param name="Ctrl"></param>
  54. /// <param name="Checked"></param>
  55. public static void SetCheckBoxChecked(CheckBox Ctrl, bool Checked)
  56. {
  57. Ctrl.Invoke(new SetCheckBoxCheckedDelegate(SetCheckBoxCheckedFunc), new object[] { Ctrl, Checked });
  58. }
  59. }
  60. }

单选按钮(RadioButton)

RadioButtonInvoke.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. namespace XY.WINUI.ControlEx.InvokeEx
  6. {
  7. /// <summary>
  8. /// RadioButtonInvoke
  9. /// </summary>
  10. public class RadioButtonInvoke
  11. {
  12. /// <summary>
  13. /// 获取单选按钮选中状态委托
  14. /// </summary>
  15. /// <param name="Ctrl"></param>
  16. private delegate bool GetRadioButtonCheckedDelegate(RadioButton Ctrl);
  17. /// <summary>
  18. /// 设置单选按钮选中状态委托
  19. /// </summary>
  20. /// <param name="Ctrl"></param>
  21. /// <param name="Checked"></param>
  22. private delegate void SetRadioButtonCheckedDelegate(RadioButton Ctrl, bool Checked);
  23. /// <summary>
  24. /// 获取单选按钮选中状态方法
  25. /// </summary>
  26. /// <param name="Ctrl"></param>
  27. private static bool GetRadioButtonCheckedFunc(RadioButton Ctrl)
  28. {
  29. return Ctrl.Checked;
  30. }
  31. /// <summary>
  32. /// 获取单选按钮选中状态
  33. /// </summary>
  34. /// <param name="Ctrl"></param>
  35. /// <returns></returns>
  36. public static bool GetRadioButtonChecked(RadioButton Ctrl)
  37. {
  38. return (bool)Ctrl.Invoke(new GetRadioButtonCheckedDelegate(GetRadioButtonCheckedFunc), new object[] { Ctrl });
  39. }
  40. /// <summary>
  41. /// 设置单选按钮选中状态方法
  42. /// </summary>
  43. /// <param name="Ctrl"></param>
  44. /// <param name="Checked"></param>
  45. private static void SetRadioButtonCheckedFunc(RadioButton Ctrl, bool Checked)
  46. {
  47. Ctrl.Checked = Checked;
  48. Ctrl.Refresh();
  49. }
  50. /// <summary>
  51. /// 设置单选按钮选中状态
  52. /// </summary>
  53. /// <param name="Ctrl"></param>
  54. /// <param name="Checked"></param>
  55. public static void SetRadioButtonChecked(RadioButton Ctrl, bool Checked)
  56. {
  57. Ctrl.Invoke(new SetRadioButtonCheckedDelegate(SetRadioButtonCheckedFunc), new object[] { Ctrl, Checked });
  58. }
  59. }
  60. }

进度条(ProgressBar)

ProgressBarInvoke.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. namespace XY.WINUI.ControlEx.InvokeEx
  6. {
  7. /// <summary>
  8. /// ProgressBarInvoke
  9. /// </summary>
  10. public class ProgressBarInvoke
  11. {
  12. /// <summary>
  13. /// 获取进度条当前值委托
  14. /// </summary>
  15. /// <param name="Ctrl"></param>
  16. private delegate int GetProgressBarValueDelegate(ProgressBar Ctrl);
  17. /// <summary>
  18. /// 设置进度条当前值委托
  19. /// </summary>
  20. /// <param name="Ctrl"></param>
  21. /// <param name="Value"></param>
  22. private delegate void SetProgressBarValueDelegate(ProgressBar Ctrl, int Value);
  23. /// <summary>
  24. /// 获取进度条最小值委托
  25. /// </summary>
  26. /// <param name="Ctrl"></param>
  27. private delegate int GetProgressBarMinValueDelegate(ProgressBar Ctrl);
  28. /// <summary>
  29. /// 设置进度条最小值委托
  30. /// </summary>
  31. /// <param name="Ctrl"></param>
  32. /// <param name="Value"></param>
  33. private delegate void SetProgressBarMinValueDelegate(ProgressBar Ctrl, int Value);
  34. /// <summary>
  35. /// 获取进度条最大值委托
  36. /// </summary>
  37. /// <param name="Ctrl"></param>
  38. private delegate int GetProgressBarMaxValueDelegate(ProgressBar Ctrl);
  39. /// <summary>
  40. /// 设置进度条最大值委托
  41. /// </summary>
  42. /// <param name="Ctrl"></param>
  43. /// <param name="Value"></param>
  44. private delegate void SetProgressBarMaxValueDelegate(ProgressBar Ctrl, int Value);
  45. /// <summary>
  46. /// 获取进度条当前值方法
  47. /// </summary>
  48. /// <param name="Ctrl"></param>
  49. private static int GetProgressBarValueFunc(ProgressBar Ctrl)
  50. {
  51. return Ctrl.Value;
  52. }
  53. /// <summary>
  54. /// 获取进度条当前值
  55. /// </summary>
  56. /// <param name="Ctrl"></param>
  57. /// <returns></returns>
  58. public static int GetProgressBarValue(ProgressBar Ctrl)
  59. {
  60. return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarValueFunc), new object[] { Ctrl });
  61. }
  62. /// <summary>
  63. /// 设置进度条当前值方法
  64. /// </summary>
  65. /// <param name="Ctrl"></param>
  66. /// <param name="Value"></param>
  67. private static void SetProgressBarValueFunc(ProgressBar Ctrl, int Value)
  68. {
  69. Ctrl.Value = Value;
  70. Ctrl.Refresh();
  71. }
  72. /// <summary>
  73. /// 设置进度条当前值
  74. /// </summary>
  75. /// <param name="Ctrl"></param>
  76. /// <param name="Value"></param>
  77. public static void SetProgressBarValue(ProgressBar Ctrl, int Value)
  78. {
  79. Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarValueFunc), new object[] { Ctrl, Value });
  80. }
  81. /// <summary>
  82. /// 获取进度条最小值方法
  83. /// </summary>
  84. /// <param name="Ctrl"></param>
  85. private static int GetProgressBarMinValueFunc(ProgressBar Ctrl)
  86. {
  87. return Ctrl.Minimum;
  88. }
  89. /// <summary>
  90. /// 获取进度条最小值
  91. /// </summary>
  92. /// <param name="Ctrl"></param>
  93. /// <returns></returns>
  94. public static int GetProgressBarMinValue(ProgressBar Ctrl)
  95. {
  96. return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarMinValueFunc), new object[] { Ctrl });
  97. }
  98. /// <summary>
  99. /// 设置进度条最小值方法
  100. /// </summary>
  101. /// <param name="Ctrl"></param>
  102. /// <param name="Value"></param>
  103. private static void SetProgressBarMinValueFunc(ProgressBar Ctrl, int Value)
  104. {
  105. Ctrl.Minimum = Value;
  106. Ctrl.Refresh();
  107. }
  108. /// <summary>
  109. /// 设置进度条最小值
  110. /// </summary>
  111. /// <param name="Ctrl"></param>
  112. /// <param name="Value"></param>
  113. public static void SetProgressBarMinValue(ProgressBar Ctrl, int Value)
  114. {
  115. Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarMinValueFunc), new object[] { Ctrl, Value });
  116. }
  117. /// <summary>
  118. /// 获取进度条最大值方法
  119. /// </summary>
  120. /// <param name="Ctrl"></param>
  121. private static int GetProgressBarMaxValueFunc(ProgressBar Ctrl)
  122. {
  123. return Ctrl.Maximum;
  124. }
  125. /// <summary>
  126. /// 获取进度条最大值
  127. /// </summary>
  128. /// <param name="Ctrl"></param>
  129. /// <returns></returns>
  130. public static int GetProgressBarMaxValue(ProgressBar Ctrl)
  131. {
  132. return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarMaxValueFunc), new object[] { Ctrl });
  133. }
  134. /// <summary>
  135. /// 设置进度条最大值方法
  136. /// </summary>
  137. /// <param name="Ctrl"></param>
  138. /// <param name="Value"></param>
  139. private static void SetProgressBarMaxValueFunc(ProgressBar Ctrl, int Value)
  140. {
  141. Ctrl.Maximum = Value;
  142. Ctrl.Refresh();
  143. }
  144. /// <summary>
  145. /// 设置进度条最大值
  146. /// </summary>
  147. /// <param name="Ctrl"></param>
  148. /// <param name="Value"></param>
  149. public static void SetProgressBarMaxValue(ProgressBar Ctrl, int Value)
  150. {
  151. Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarMaxValueFunc), new object[] { Ctrl, Value });
  152. }
  153. }
  154. }

GitHub源码

由于时间关系,暂时就封装了这么多。

会持续更新……

欢迎大家补充。

WinForm跨线程UI操作常用控件类大全

[WinForm]WinForm跨线程UI操作常用控件类大全的更多相关文章

  1. c#中如何跨线程调用windows窗体控件

    c#中如何跨线程调用windows窗体控件?   我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...

  2. 如何跨线程调用Windows窗体控件

    通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它.那么,如何解决跨 ...

  3. c#中如何跨线程调用windows窗体控件?

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来看传统方法: public partial c ...

  4. iOS开发-UI (一)常用控件

    从这里开始是UI篇 知识点: 1.常用IOS基本控件 2.UITouch ======================= 常用基本控件 1.UISegmentedControl:分段控制器 1)创建方 ...

  5. Android开发UI之常用控件的使用

    1.日期选择控件 DatePickerDialog 代码: btnChooseDate=(Button) findViewById(R.id.btnChooseDate); btnChooseDate ...

  6. 理解SynchronizationContext,如何在Winform里面跨线程访问UI控件

    SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文. 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为.此模型 ...

  7. Winform之跨线程更新UI

    Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...

  8. 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常

    在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...

  9. Winform 让跨线程访问变得更简单

    Winform 让跨线程访问变得更简单 前言 由于多线程可能导致对控件访问的不一致,导致出现问题.C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出 ...

随机推荐

  1. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  2. 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)

    上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...

  3. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  6. spring注解源码分析--how does autowired works?

    1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...

  7. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

  8. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  9. 【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

    这是一个iOS项目雅黑深邃的K线的绘制. 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://git ...

  10. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...