c#其他类调用主界面的textbox控件

先说明本人水平不高
做一个WPF软件,主界面中有一个TextBox,现在要在一个其他的类中向它中打印。
然后提示,调用线程必须为 STA,因为许多 UI 组件都需要。
现在想知道怎么能让MainWindow向这个类中传递此TextBox。
这个类是定时运行的,非主界面启动的,而且在主界面前加载。

7个回答

首先不建议楼主这样去进行传递,因为这样做的话会使你定义的类和MainWindow类产生紧耦合,这样的代码是最劣等代码,如果楼主只为了达成功能不在意这些的话方法还是有很多的,比如说你的这个类是class A{ },你在另外一个非UI线程创建了A的一个实例a,然后你想在这个线程内通过a的某个属性或者字段获取MainWindow实例里面一个Textbox输入框的引用,然后你这个类还是先于MainWindow类进行实例化的你可以这样:
首先定义你的类A,有一个公共可访问的属性CurTextBox:
public class A
{
public TextBox CurTextBox{ get; set;}
。。。。。
}
然后这样在你的MainWindow类里面重载一个构造函数,并且为实例a的CurTextBox属性添加对当前Window上TextBox的引用:
public class MainWindow
{
public MainWindow(A a)
{
if(a!== null)
{
a.CurTextBox = this.textbox1;

}
}
}
然后你要刷新这个TextBox的话需要这样:
由于你是跨线程进行UI控件的调用,所以必须使用Dispatcher类的Invoke()或者BeginInvoke()方法:

所以整体代码结构应该大概是这样:
using System.Threading;
namespace Test{
class Program
{
A a = new A();//实例化A
MainWindow win = new MainWindow(a);//实例化MainWindow

    //开启你的刷新线程
    Thread td = new Thread(()=>{
            //定时刷新
            While(true)
            {
                    .......
                    .......
                    Application.Current.Dispatcher.Invoke(new Action(()=>{
                            a.CurTextBox.Text = "abc";//进行刷新        
                    }));
            }
    });
    td.Start();

}
}
这样的话就可以满足你的要求,但是这种方法真的太low,代码紧紧耦合到一起,以后需求一旦变更,你就等着哭吧,例如我把TextBox改成Label,你就需要改MainWindow构造函数的参数类型,还要改各个实例化赋值等,这样会累死你。所以有更好的方法去做这个事情,拿WPF来说,比较好的一个方法就是用资源Resource类,因为资源是全局可以访问的,不需要传递,代码大概是这样的:
你只需要在MainWindow的构造函数内将资源赋值
public class MainWindow
{
public MainWindow()
{
Application.Current.Resource["CurTextBox"] = this.textbox1;//这样就添加了一个全局可以访问的资源
}
}
接下来是调用:

using System.Threading;
namespace Test{
class Program
{
A a = new A();//实例化A(起始此时A根本就没必要了,如果你有其他需要处理的话保存)
MainWindow win = new MainWindow();//实例化MainWindow

    //开启你的刷新线程
    Thread td = new Thread(()=>{
            //定时刷新
            While(true)
            {
                    .......
                    .......
                    Application.Current.Dispatcher.Invoke(new Action(()=>{
                            TextBox tb = Application.Current.Resource["CurTextBox"] as TextBox;
                            tb.Text = "abc";//进行刷新      
                    }));
            }
    });
    td.Start();

}
}
这样不仅在这个线程内可以访问到textbox1,而且在整个Application的任何地方都可以随时访问这个textbox1。

gangqin6084
jlu_weige 谢大神指点,用了第二种方法
一年多之前 回复

新建一个类
public class GlobalData
{
public static string Value;
}
在你界面的构造函数里
textBox1.Text = GlobalData.Value;
在TextBox1的Change事件里
GlobalData.Value = textBox1.Text;

在你其他需要访问的类
GlobalData.Value就是。

wrarjkf
wrarjkf 厉害
9 个月之前 回复
caozhy
贵阳老马马善福专门编写代码的老马就是我! 回复OHISAY: 谢谢。
一年多之前 回复
qq_28197211
OHISAY 这是正确答案,师傅赞一个。
一年多之前 回复

不需要传递TextBox,传递一个字符串,用TextBox.Text就可以了。

hxycsdn9159
hxycsdn9159 这位仁兄这样做是不可行的: String s = textbox1.Text; s = "abc"; 难道你认为此时textbox1.Text也变成“abc”了吗?
一年多之前 回复
gangqin6084
jlu_weige 不是很懂,大神能麻烦说的在清楚点吗
一年多之前 回复

应该使用委托吧 this.invoke,好像是这样

一种是用委托还有一种是传递窗口消息

Application.Current.Dispatcher.Invoke(new Action(()=>{ /*TextBox输入框赋值*/ }))

private void button2_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(new ParameterizedThreadStart(UpdateLabel2));
thread1.Start("更新Label");
}

    private void UpdateLabel2(object str)
    {
        if (label2.InvokeRequired)
        {
            // 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它
            Action<string> actionDelegate = (x) => { this.label2.Text = x.ToString(); };
            // 或者
            // Action<string> actionDelegate = delegate(string txt) { this.label2.Text = txt; };
            this.label2.Invoke(actionDelegate, str);
        }
        else
        {
            this.label2.Text = str.ToString();
        }
    }  
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
调用其他类的控件
我现在想在一个类里面调用其他类的控件,代码是这样写的:rnHWND htextedit=::FindWindow(L"CDesktopCalendar",NULL);rnCFont* TempFont =GetDlgItem(IDC_EDIT1,htextedit)->GetFont(); rnrn调试的时候提示我如下错误:rnerror C2664:"void CWnd::GetDlgItem(int,HWHD *)const":不能将参数2从“HWND”转化为“HWND *”。rnrn我是先用FindWindow找到窗口指针,然后再用GetDlgItem找到控件,请问这个问题怎么解决?
主界面的问题
之前写好了几个界面rn现在想加个界面,主要显示图片渐变渐淡的过程rn然后开始显示主界面rn但是现在加了这个图片变化界面的时候rn启动程序,还是先显示原先的主界面rn怎么解决呢
主界面的实现
实现大众点评吃包子小人等待效果
其他类怎么调用主类的Handler
我让一个类继承了Thread,在run()方法里面调用了Hanlder,但是主类MainActivity的UI并没有做出对应的改变rn不知道怎么回事,求解[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/50.gif][/img]
Qt 在主界面调用另一个界面的控件
首先说明,我是在vs+qt+vtk的环境下进行的。 1、关于如何在这种环境下建立一个新的ui界面。 我原来有一个项目,需要添加一个新的界面,实现分屏显示,整个项目是通过CMAKE进行管理的,所以,要先在QtCreator中新建一个qt的界面,需要什么窗口类型就新建一个什么类型的窗口。将项目文件夹中的.ui/.cxx/.h三个文件拷贝到现有的工程中,在CMakeList中把新添加的文件写进去。然后再...
C#中子线程创建控件在主窗口界面的更新问题
在子线程中通过代码创建一控件,并将之添加到主窗口界面中,下次在子线程中修改该线程创建的控件数据,数据不会改变,而在界面中固有的控件(非子线程创建)可以正常修改,请问该如何修改子线程创建的控件在主窗口界面的显示,谢谢rn代码如下rn[code=C#]using System;rnusing System.Collections.Generic;rnusing System.ComponentModel;rnusing System.Data;rnusing System.Drawing;rnusing System.Linq;rnusing System.Text;rnusing System.Windows.Forms;rnusing System.Threading;rnrnnamespace multiThreadTestrnrn public partial class Form1 : Formrn rn int i = 0;rn public Form1()rn rn InitializeComponent();rn rnrn public delegate void chageMain(string str);rnrn private void childThread()rn rn modify("yang");rn i++;rn //modify("beijing");rn rnrn private void modify(string str)rn rn this.Invoke(new System.Actionrn (delegate rn rn this.label1.Text = "窗口中已有控件" + str + i.ToString();rn Label lb = new Label();rn lb.Text = "自创控件" + str + i.ToString();//自己创建的控件rn this.Controls.Add(lb);rn rn ), 1); rn rnrn private void button1_Click(object sender, EventArgs e)rn rn //this.label1.Text = i.ToString();rn var t1 = new Thread(childThread);rn t1.IsBackground = true;rn t1.Start();rn rn rn[/code]rnrn其中label1是在主窗口中拖放的一控件,lb是子线程中创建的控件,两次运行的结果如下图:rn[img=http://hi.csdn.net/attachment/201201/4/474380_13256679281C7S.jpg][/img]
C#中QQ主界面的控件是什么?
最近在学C#,做MyQQ项目,不知道主界面的控件
主界面——主界面的创建
综合前面的知识点,剔除繁杂的理论,注重实践,深入浅出综合使用Android中的知识实现一个短信管理类的App
关于主界面的问题
:rnC/S的系统,主界面中(主界面数据库),有个祯结构嵌入的是别的数据库中视图。rn当打开数据库时候。所嵌入的那个祯结构经常会显示不出来。出现灰色屏幕。在主界面中,我已经加了将那个视图加入工作台的代码。rn有办法吗?
viewpager+tab 主界面的实现
viewpage+底部导航栏效果代码public class MainActivity extends Activity implements View.OnClickListener{ private LinearLayout Lone,Ltwo,Lthree,Lfour; private FrameLayout one,two,three,four; private
进销存系统主界面的创建
进销存主界面的创建,面板和布局的使用,图片、背景的插入
返回主界面的问题
我设置了当点击主界面的功能按钮时,弹出子功能界面,同时主界面的Visible = false;但是在子界面里有一个返回主界面的按钮我是这样定义的rn MainUi main = new MainUi();rn main.Visible = true;rn this.Close();rnMainUi 是主窗口类。rn可是点击之后的效果是直接关闭系统,不知道是什么错误,我是新手,求高手指教~~~~~rn
如何调用另一界面的控件
在form1上按一按钮,显示form2后,如何能同时使使2上的一些按钮不可见??form2.Button1.enable不行
QQ界面的控件
delphi 实现QQ界面的控件 仿QQ好友列表,QQ好友列实现,一个仿QQ好友列表源码实现
怎样获取其他的进程的主界面的图片?
我想获取其他的进程的主界面的图片,怎样获取呢?是否可以通过获取其他的进程的hdc来实现,但查了一下,好像不能实现,还可以用什么方式来获取其他进程的主界面的图片呢?
请教vc++MFC中 如何在新建的的类中 调用主界面的控件
rn问题描述:rn环境:vc++ MFCrn在我的工程中,我新建了一个类Cmyclass1,这个类会在主界面CmyDlg里面生成一个实例;rn在Cmyclass1,中,需要调用主主界面里面的一个控件IDC_STATIC_MAP,得到控件的尺寸大小,同时还要用到这个控件的窗口句柄,rnrnrn我本想在Cmyclass1的构造函数里面传递主界面的窗口句柄,并保存为该类的公有变量pWnd,这样我就可以调用主界面的任何一个控件了;rnrnpWnd->GetDlgItem(IDC_STATIC_MAP)->GetWindowRect();rnrn可是我在 Cmyclass1类中调用上面的语句时,却提示IDC_STATIC_MAP不可用;rnrn请大家解答或提供更好的方法
##关于调用其他类里面的变量
是这样的我在一个类里面定义了一个rnCLA Classrnrnstatic CString name;rn....rnrn然后在另一个类里面调用这个namernCLA::namern为什么编译说我什么什么没有这个class什么的rnrn头人间我也包含了不晓得为什么rnrn在线等
类Excel界面的编程问题
比如在Excel中,有3个sheet,分别是sheet1,sheet2,sheet3,当点击sheet1时,就隐藏掉其它sheet。是用tab控件或propertysheet吗?谢谢。
实现GUI界面的类
本季课程为Python面向对象基础篇,内容包含:面向对象的介绍、创建类和实例化、实例变量和实例方法、类变量和类方法、静态方法、私有变量、属性、类的组合等等
实现VC界面的类
【包含sizecbar.h sizecbar.cpp scbarg.h scbarg.cpp 四个文件及CoolTabCtrl.cpp CoolTabCtrl.h】 一、实现原理 图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所需的界面。 二、实现步骤示例 [1]前期准备 新建一个名为BarDemo的MFC工程,SDI界面,其它选项默认。 将本文示例代码中的sizecbar.h sizecbar.cpp scbarg.h scbarg.cpp 四个文件复制到工程目录下。 在菜单Project->Add to project->Files将四个文件加入工程中,此时在ClassView中将出现了一个称为CCoolBar的类。 在stdafx.h文件中加上 #include "sizecbar.h" #include "scbarg.h" [2]开始编码 ……
类VC界面的实现
需要做一个类似VC2003那样的界面rnrnVCKBASE.com上面的例子,也看过了rn都没有实现右边的标签多视图 我也在试了很多方法,就是没有办法和VC2003一样.rnrn那位有做过指点下,或者发个简单的工程我!rnrnwindeer@163.comrnrn在这里谢先
其他类调用C#控件并修改属性的方法
应用需求: 经常我们会碰到这样的情况,我们需要在其他C#类里面调用控件并修改其中的某个属性。 解决办法: 1.在控件类中添加静态变量: public static Form1 form; 2.然后在其构造函数中把这个类自己本身传给上面这个静态类。 form = this; 3.再把你需要调用的控件的Modifiers属性修改为public,这样外部的类才能获取这个控件。 ...
BCB线程中调用主界面的回调函数
网上的回调函数都是API例子,学习函数指针倒是不错,可是很难让初学者立即应用。常见的情况是辅线程完成某事件后需要“通知”主界面,比如常见的进度条——线程中完成一定的进度后即通知主界面显示到一定的刻度。本程序解决了bcb中回调函数的实用问题,可以当模板套用。代码有一定的注释,简单易懂,至少对于学BCB的人来说,是网上找不到的例子! Form1->ProgressBar1->Position=0; pMyCallback=new callthread(false); //开启线程 pMyCallback->RegisterDataCallBackFun(Progress); //注册回调函数接口 ......
vfp中菜单调用主界面的问题
请教各位老师,我用VFP编了个小程序,在主界面表单中生成了菜单项,其中有一个菜单项为"重新登陆",第一次运行登陆表单时可以调用界面表单,但我点击“重新登陆”后,再次登陆时,又调用了界面表单,桌面上有两个主界面表单了,再次操作,再增加一个!这是怎么回事啊?要怎么改啊?
主类调用
[code=&quot;java&quot;] private void initTable() throws FileNotFoundException, IOException { //表头 String[] headTitle = { &quot;状态&quot;, &quot;名称&quot;, &quot;值&quot; }; //图标 Icon icon = new ImageIcon(&quot;img/activate_up.gi...
winform 用户控件禁用和启用主界面的控件
我的用户控件上有个按钮,点击按钮就禁用主界面中某个按钮,这应该怎么做rn我这样写点击用户控件中的按钮时UpgradeEvent总是为nullrnrnrn主界面rnrn public partial class FormMain : Formrn rn ControlProcedureUpgrade CPUpgrade = new ControlProcedureUpgrade();rn public FormMain()rn rn InitializeComponent();rn CPUpgrade.UpgradeEvent += new ControlProcedureUpgrade.SendInfo(UpgradeFalse);rn rnrn public void UpgradeFalse(object sender, EventArgs e)rn rnrn menuStrip1.Enabled = false;rn toolBar.Enabled = false;rn rn rnrn用户控件rnpublic partial class ControlProcedureUpgrade : UserControlrn rn public delegate void SendInfo(object sender, EventArgs e);rn public event SendInfo UpgradeEvent;rn private void btnSendIPPort_Click(object sender, EventArgs e)rn rn if (UpgradeEvent != null)rn UpgradeEvent(this, EventArgs.Empty);rn rn
控件随主界面的大小变动而变,如何做!?
我在mdi窗口的左边放了一个picturebox,很狭窄的,象oicq栏一样rnrn我在picturebox的下面放了一个按纽rn问题是:我在分辨率为1024*768下可以看到按纽,在800*600下就看不到了rnrn而且对窗口进行缩小也看不到rnrn怎么办
如何控制主界面的listview控件刷新 (100分)`~~~~~~~~~~~~~~`
主界面有listview,当子界面关闭时,触发事件引起主界面listview刷新,该如何实现?rnrn我主界面打开子界面用的是ShowDialog()方法。请说的详细一点哈,有代码最好~~~~~~~~~~
office outlook界面的调用
你好,我想调用office outlook的界面,希望大家帮忙。。。。rn谢谢。。。
关于主界面的提醒标签控件问题
我看到很多BS系统的主界面都是这样的:rn[img=https://img-bbs.csdn.net/upload/201410/14/1413272325_980851.png][/img]rn我想问一下 Delphi 里有没有类似的第三方控件可以实现这个效果,要有一下功能:rn1. 每个 panel 可以随着窗体的缩放实现自动缩放;rn2.panel 里的 文件可以显示一个图标;rn3.每个panel 可以拖拉实现位置的调换;rnrn
界面的界面的制作
调用一个函数发现当用户按下“查找”按钮,您使用Qt的信号和槽机制。 一个信号发出时,一个特定事件发生和槽是一个函数,称为响应特定的信号。 Qt控件具有预定义的信号和槽,你可以直接使用从Qt设计器。为查找功能添加一个槽
c#调用存储过程 和其他功能的类
    public class DBCLASS//一个强大的类     {         public string sqlstr = &quot;Data Source=192.168.132.205;Initial Catalog=XuanKeManage;Integrated Security=false;User ID = sa; Password=123;Max Pool Size=512;&quot;...
c# 使用了定时器却不能访问主界面的按钮
小弟最近做个项目,想用隔一段时间读一次串口的数据并且显示在主界面上,最初的想法是用while死循环,里面用thread.Sleep函数做延时,后来发现这样程序一旦执行就关不掉了(程序死在while循环里了),连主界面上的其他按钮也访问不了了。 因此后来想用多线程,但新开的线程函数似乎不能访问当前窗体的线程的资源,比如不能在另外一个线程里面对当前窗体的textbox控件的text属性赋值,如果非要这么做有点麻烦,似乎要用到委托什么的。 后来又想到了可以访问窗体控件的定时器System.Windows.Forms.Timer,也就是定时一定时间更新一次textbox的text属性,但一运行程序就又卡住了(主窗体上的其他按钮包括关闭按钮都按不了了),并且我加长了定时时间和注释了一些定时触发函数里面的代码,却还是不能点击其他按钮。rn 求大神指点一下呀。rn附:主界面如下:rn[img=http://img.my.csdn.net/uploads/201211/12/1352729231_6325.jpg][/img]rn部分代码为rn private void BtnEnd_Click(object sender, EventArgs e)rn rn if (port.IsOpen)rn port.Close();rn rnrn private void timer1_Tick(object sender, EventArgs e)rn rn ComReadThread(sender);rn rnrn public void ComReadThread(object obj)rn rn while (port.IsOpen)rn rn if (port.BytesToRead > 0)rn rn strRecv = port.ReadExisting();rn //this.text_showGps.Text += strRecv;rn //text_showGps.SelectionStart = text_showGps.TextLength;rn //text_showGps.ScrollToCaret();rnrn GetGps();rn if (Convert.ToDouble(Longitude) > 0)rn rn if (Convert.ToDouble(Longitude) > max_lon)rn max_lon = Convert.ToDouble(Longitude);rn if (Convert.ToDouble(Latitude) > max_lat)rn max_lat = Convert.ToDouble(Latitude);rnrn if (Convert.ToDouble(Longitude) < min_lon && Convert.ToDouble(Longitude) > 0)rn min_lon = Convert.ToDouble(Longitude);rn if (Convert.ToDouble(Latitude) < min_lat && Convert.ToDouble(Latitude) > 0)rn min_lat = Convert.ToDouble(Latitude);rnrn text_maxLon.Text = max_lon.ToString();rn text_maxLat.Text = max_lat.ToString();rn text_minLon.Text = min_lon.ToString();rn text_minLat.Text = min_lat.ToString();rnrnrn double error_lat = (max_lat - min_lat) * Rj / 180; //获得纬度上的距离 L = Rj * ( lat1 -lat0 ) / 180rn //获得经度上的距离 L = Rc * cos(lat0) * ( lon1 -lon0 ) / 180rn double error_lon = (max_lon - min_lon) * Rc / 180 * Math.Cos(min_lat / 180);rn text_error.Text = (Math.Sqrt(error_lon * error_lon + error_lat * error_lat)).ToString();rn //text_error.Text = (Sqrt(error_lon * error_lon + error_lat * error_lat) * 6370000 / 60).ToString();rnrn rn //Thread.Sleep(500);rn rn rn rn
在其他类调用类的成员变量
eg:rn//AViewController.hrn#importrnrn@interface AViewController:UIViewControllerrnrn CGPint point;rnrnrn@property(nonatomic, assign) CGPoint point;rnrn@endrnrn//AViewController.mrn#import "AViewController.h"rnrn@implementation AViewControllerrnrn@synthesize point;rnrn……rnrn@endrnrn//BAppDelegate.hrn#import "AViewController.h"rn#import "……"rnrn@class AViewControllerrnrn@interface BAppDelegate:NSObjectrn AViewController *a;rnrnrn@property (nonatomic, retain) AViewController *a;rnrn-(void) Func;rnrn……//别的函数的声明rnrn@endrnrn//BAppDelegate.mrn#import "BAppDelegate.h"rn#import "……"rnrn@implementation BAppDelegaternrn@synthesize a;rnrn-(void) Funcrn CGPoiunt pt = a.point;//访问不到,这是为什么呢? 错误信息是在第一次使用point时,我没有声明rnrnrn……//别的函数的实现rnrn@endrnrnrnrn如上所述,为什么我会调用不到呢? 哪位DX帮忙小弟解决一下,谢谢先!
winform界面的皮肤控件
资源控件美化winform程序的界面。 在winform中,将IrisSkin2.dll应用进来,在onload事件中编写代码 本控件提供了两种样式:水晶蓝和水晶绿,十分美观
界面的控件问题请教
请教各位,要实现类似的界面,需要用啥控件?ListBox,listCtrl,TreeCtrl?rn[img=http://hi.csdn.net/attachment/201011/28/3669637_129095177811c1.png][/img]rnrn第一次发贴,一定会结贴的,请各位指点迷津!
仿金山词霸界面的控件
仿金山词霸界面的工具栏,展开和缩放功能,按钮,状态栏,背景色的选择与设置.
关于控件界面的问题
我要把位图的一部分图象粘在一个控件按扭上rnrn1 请问:流程是怎么样?应该怎么做?rn2 怎么用 HDC 保存一幅位图的?
MFC 主界面的事属性页模式
MFC实现的属性页,很好的界面,有位图,想学习和想借鉴的可以下载,感谢您的支持!
android 主界面的布局制作
[url]http://stackoverflow.com/questions/3535958/how-to-setup-a-main-menu-layout-in-android[/url]
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数