图片来自网络/图文无关
在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作。不过会有一个问题:就是涉及到跨线程操作UI元素。
相信才开始接触的人一定会遇上这个问题。
为了解决这个问题,可以通过委托来实现。
我为了后期使用更加方便,就将常用的几个控件(TextBox、Label、CheckBox、RadioButton、ProgressBar)UI操作进行了封装,源码可以在github上查看:GitHub仓库地址。
源码在github仓库中的XY.WINUI.ControlEx.InvokeEx文件夹中
测试窗体
在测试项目中有使用的方法,这里只做简单介绍。
调用方法在Invokes类中,也可以使用单独的类调用。
例如:在窗体中为tbName的TextBox设置和获取值
//首先,使用命名空间
using XY.WINUI.ControlEx.InvokeEx;
//第一种
//设置TextBox的值
Invokes.SetTextBoxText(tbName,\"TextBox文本\");
//获取TextBox的值
string value = Invokes.GetTextBoxText(tbName);
//第二种
//设置TextBox的值
TextBoxInvoke.SetTextBoxText(tbName,\"TextBox文本\");
//获取TextBox的值
string value = TextBoxInvoke.GetTextBoxText(tbName);
这是部分的代码,需要详细了解可以在 GitHub 上查看。
集合类(Invokes.cs)
Invokes.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace XY.WINUI.ControlEx.InvokeEx
{
public class Invokes
{
#region //Controls
#region // TextBox
///
/// 设置文本框文本
///
///
///
public static void SetTextBoxText(TextBox Ctrl, string Text)
{
TextBoxInvoke.SetTextBoxText(Ctrl, Text);
}
///
/// 获取文本框文本方法
///
///
public static string GetTextBoxText(TextBox Ctrl)
{
return TextBoxInvoke.GetTextBoxText(Ctrl); ;
}
#endregion
#region // Label
///
/// 设置标签文本
///
///
///
public static void SetLabelText(Label Ctrl, string Text)
{
LabelInvoke.SetLabelText(Ctrl, Text);
}
///
/// 获取标签文本方法
///
///
public static string GetLabelText(Label Ctrl)
{
return LabelInvoke.GetLabelText(Ctrl); ;
}
#endregion
#region // RadioButton
///
/// 获取单选按钮选中状态
///
///
///
public static bool GetRadioButtonChecked(RadioButton Ctrl)
{
return RadioButtonInvoke.GetRadioButtonChecked(Ctrl);
}
///
/// 设置单选按钮选中状态
///
///
///
public static void SetRadioButtonChecked(RadioButton Ctrl, bool Checked)
{
RadioButtonInvoke.SetRadioButtonChecked(Ctrl, Checked);
}
#endregion
#region // CheckBox
///
/// 获取选择按钮选中状态
///
///
///
public static bool GetCheckBoxChecked(CheckBox Ctrl)
{
return CheckBoxInvoke.GetCheckBoxChecked(Ctrl);
}
///
/// 设置选择按钮选中状态
///
///
///
public static void SetCheckBoxChecked(CheckBox Ctrl, bool Checked)
{
CheckBoxInvoke.SetCheckBoxChecked(Ctrl, Checked);
}
#endregion
#region // ProgressBar
///
/// 获取进度条值
///
///
public static int GetProgressBarValue(ProgressBar Ctrl)
{
return ProgressBarInvoke.GetProgressBarValue(Ctrl);
}
///
/// 设置进度条值
///
///
///
public static void SetProgressBarValue(ProgressBar Ctrl, int Value)
{
ProgressBarInvoke.SetProgressBarValue(Ctrl, Value);
}
///
/// 获取进度条最小值
///
///
public static int GetProgressBarMinValue(ProgressBar Ctrl)
{
return ProgressBarInvoke.GetProgressBarMinValue(Ctrl);
}
///
/// 设置进度条最小值
///
///
///
public static void SetProgressBarMinValue(ProgressBar Ctrl, int Value)
{
ProgressBarInvoke.SetProgressBarMinValue(Ctrl, Value);
}
///
/// 获取进度条最大值
///
///
public static int GetProgressBarMaxValue(ProgressBar Ctrl)
{
return ProgressBarInvoke.GetProgressBarMaxValue(Ctrl);
}
///
/// 设置进度条最大值
///
///
///
public static void SetProgressBarMaxValue(ProgressBar Ctrl, int Value)
{
ProgressBarInvoke.SetProgressBarMaxValue(Ctrl, Value);
}
#endregion
#endregion
#region // Common
#region // Visible
///
/// 获取控件是否可见委托
///
///
private delegate bool GetControlVisibleDelegate(Control Ctrl);
///
/// 设置控件是否可见委托
///
///
///
private delegate void SetControlVisibleDelegate(Control Ctrl, bool Visible);
///
/// 获取控件是否可见方法
///
///
private static bool GetControlVisibleFunc(Control Ctrl)
{
return Ctrl.Visible;
}
///
/// 获取控件是否可见
///
///
public static bool GetControlVisible(Control Ctrl)
{
return (bool)Ctrl.Invoke(new SetControlVisibleDelegate(SetControlVisibleFunc), new object[] { Ctrl });
}
///
/// 设置控件是否可见方法
///
///
///
private static void SetControlVisibleFunc(Control Ctrl, bool Visible)
{
Ctrl.Visible = Visible;
Ctrl.Refresh();
}
///
/// 设置控件是否可见
///
///
///
public static void SetControlVisible(Control Ctrl, bool Visible)
{
Ctrl.Invoke(new SetControlVisibleDelegate(SetControlVisibleFunc), new object[] { Ctrl, Visible });
}
#endregion
#endregion
}
}
由于排版问题,就不过多展示代码了,可以在github仓库查看。
会持续更新……
欢迎大家补充。