我有简单的WPF应用程序,我使用线程。例如。在新线程中,我得到DateTime,我想将它返回到主线程中的TextBox。我读这样做我必须使用ControlDispatcher.Invoke方法。但是出了点问题......
namespace Bizantyjskie
{
public static class ControlExtensions
{
public static void InvokeIfRequired(this Control control, Action action)
{
if (System.Threading.Thread.CurrentThread != control.Dispatcher.Thread)
control.Dispatcher.Invoke(action);
else
action();
}
public static void InvokeIfRequired<T>(this Control control, Action<T> action, T parameter)
{
if (System.Threading.Thread.CurrentThread != control.Dispatcher.Thread)
control.Dispatcher.Invoke(action, parameter);
else
action(parameter);
}
}
class watki
{
public watki(MainWindow mw)
{
_mw = mw;
}
public MainWindow _mw;
public void dzialaj()
{
Thread watek1 = new Thread(new ThreadStart(w1));
watek1.Start();
}
private void w1()
{
string godz = DateTime.Now.TimeOfDay.ToString();
ControlExtensions.InvokeIfRequired((value) => _mw.tb_w1.Text = value, godz);
}
}
}
问题在于
ControlExtensions.InvokeIfRequired((value)=&gt; _mw.tb_w1.Text = value, GODZ);
我收到了错误。
无法将lambda表达式转换为type 'System.Windows.Controls.Control'因为它不是委托类型
答案 0 :(得分:3)
您将扩展方法称为静态扩展方法而忘记传递参数。将其更改为:
_mw.InvokeIfRequired(value => _mw.tb_w1.Text = value, godz);
或者,如果您仍想将其称为静态方法:
ControlExtensions.InvokeIfRequired(_mw,
value => _mw.tb_w1.Text = value, godz);
答案 1 :(得分:0)
试试这个
private void w1()
{
string godz = DateTime.Now.TimeOfDay.ToString();
ControlExtensions.InvokeIfRequired((value) => { _mw.tb_w1.Text = value; }, godz);
}
我认为你的'价值'成员是传递给代表的参数,虽然我不能确定InvokeIfRequired
的签名 - 如果它object
不是你需要的演员?
e.g。
ControlExtensions.InvokeIfRequired((value) => { _mw.tb_w1.Text = (string)value; }, godz);
修改强>
抱歉,甚至没有看到上面的签名!看起来你只是缺少InvokeIfRequired的通用参数:
ControlExtensions.InvokeIfRequired<string>((value) => { _mw.tb_w1.Text = value; }, godz);
这应该有效:)
另一种方法是调用非泛型方法并在委托范围中捕获字符串变量:
ControlExtensions.InvokeIfRequired(() => { _mw.tb_w1.Text = godz; });
我觉得有点干净