c# wpf下的多线程操作窗口UI控件的过程
来源:互联网 发布:淘宝网平板电脑谷歌 编辑:程序博客网 时间:2024/05/21 11:36
2010-04-11 01:22:10| 分类:IT| 标签:|举报|字号大中小 订阅
wpf下的多线程操作窗口UI控件的过程和winform基本上一直,也是A线程中不能操作其他线程和主线程的控件,必须通过其他方式来处理。在winform过程是使用委托方式来处理。wpf其实也是一样的。但是wpf提供了一个更简单方式
可以先参考winform中处理过程 c#多线程操作Windows Forms控件
wpf中提供了全新的Dispatcher类。可以使用this.Dispatcher.BeginInvoke()或者控件.Dispatcher.BeginInvoke()这个方式和winform2.0是比较类似的。
举个例子wpf窗口点击一个按钮去执行一个长时间的运算,运算的中间结果显示在文本框中。
这是UI代码
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" >
<Button Content="Start"
Click="startStopButton_Click"
Name="startStopButton"
Margin="5,0,5,0"
/>
<TextBlock Margin="10,5,0,0">Biggest Prime Found:</TextBlock>
<TextBlock Name="bigPrime" Margin="4,5,0,0">3</TextBlock>
</StackPanel>
后台主要代码这样:
public delegate void NextPrimeDelegate();//定义委托
public void CheckNextNumber()//执行这个算法,并且更新文本框内容
{.................
}
private void startStopButton_Click(object sender, RoutedEventArgs e)
{
startStopButton.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new NextPrimeDelegate(CheckNextNumber));
}
这就是主要步骤和代码。
也可以完全使用winform2.0中的方法
1。开启新线程
2。定义委托
3.定义委托执行方法,在里面修改控件。主要代码this.Dispatcher.BeginInvoke
wpf中多窗口线程处理
描述如下
在主窗口中打开一个线程,这个线程去启动一个新的窗口。
代码如下
启动新线程:
Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
//线程调用方法
private void ThreadStartingPoint()
{
Window3 tempWindow = new Window3();
tempWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}
这里面有两个地方要注意,
第一个红字:这个地方必须设置这个STA,否则会报错“调用线程必须为 STA,因为许多 UI 组件都需要。”
第二个红字:如果去掉这个红字,会发现启动的窗口显示出来以后会很快就关掉。
这里有个奇怪的现象。我也不是很明白,msdn描述如下:说是启动一个新的独立线程来管理这个新的窗口。
一些 WPF 应用程序需要多个高级别窗口。一个线程/Dispatcher 组合管理多个窗口是完全可以接受的,但有时使用多个线程可以更出色地完成工作。如果其中一个窗口有可能独占该线程,那么采用多个线程就更有必要。
当用户单击“new window”(新建窗口)按钮时,便在一个单独的线程中启动了窗口的一个副本。这样,一个窗口中的长时间运行或阻止操作就不会锁定所有其他窗口。
新线程的起点。我们在此线程的控制下创建一个新窗口。WPF 自动创建一个新的 Dispatcher 来管理新线程。要使该窗口工作,只需启动 Dispatcher。
可以先参考winform中处理过程 c#多线程操作Windows Forms控件
wpf中提供了全新的Dispatcher类。可以使用this.Dispatcher.BeginInvoke()或者控件.Dispatcher.BeginInvoke()这个方式和winform2.0是比较类似的。
举个例子wpf窗口点击一个按钮去执行一个长时间的运算,运算的中间结果显示在文本框中。
这是UI代码
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" >
<Button Content="Start"
Click="startStopButton_Click"
Name="startStopButton"
Margin="5,0,5,0"
/>
<TextBlock Margin="10,5,0,0">Biggest Prime Found:</TextBlock>
<TextBlock Name="bigPrime" Margin="4,5,0,0">3</TextBlock>
</StackPanel>
后台主要代码这样:
public delegate void NextPrimeDelegate();//定义委托
public void CheckNextNumber()//执行这个算法,并且更新文本框内容
{.................
}
private void startStopButton_Click(object sender, RoutedEventArgs e)
{
startStopButton.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new NextPrimeDelegate(CheckNextNumber));
}
这就是主要步骤和代码。
也可以完全使用winform2.0中的方法
1。开启新线程
2。定义委托
3.定义委托执行方法,在里面修改控件。主要代码this.Dispatcher.BeginInvoke
wpf中多窗口线程处理
描述如下
在主窗口中打开一个线程,这个线程去启动一个新的窗口。
代码如下
启动新线程:
Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
//线程调用方法
private void ThreadStartingPoint()
{
Window3 tempWindow = new Window3();
tempWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}
这里面有两个地方要注意,
第一个红字:这个地方必须设置这个STA,否则会报错“调用线程必须为 STA,因为许多 UI 组件都需要。”
第二个红字:如果去掉这个红字,会发现启动的窗口显示出来以后会很快就关掉。
这里有个奇怪的现象。我也不是很明白,msdn描述如下:说是启动一个新的独立线程来管理这个新的窗口。
一些 WPF 应用程序需要多个高级别窗口。一个线程/Dispatcher 组合管理多个窗口是完全可以接受的,但有时使用多个线程可以更出色地完成工作。如果其中一个窗口有可能独占该线程,那么采用多个线程就更有必要。
当用户单击“new window”(新建窗口)按钮时,便在一个单独的线程中启动了窗口的一个副本。这样,一个窗口中的长时间运行或阻止操作就不会锁定所有其他窗口。
新线程的起点。我们在此线程的控制下创建一个新窗口。WPF 自动创建一个新的 Dispatcher 来管理新线程。要使该窗口工作,只需启动 Dispatcher。
http://liao.xing.wang.blog.163.com/blog/static/131742029201031112210960/
0 1
- c# wpf下的多线程操作窗口UI控件的过程
- c#多线程操作UI控件
- WPF 同一窗口内的多线程 UI(VisualTarget)
- WPF里面多线程访问UI线程、主线程的控件
- C# 多线程控制UI上的控件
- WPF下实现控件的拖动操作
- C# 窗口和控件的操作
- C#多线程操作界面控件的解决方案
- C#多线程操作界面控件的解决方案
- C#多线程操作界面控件的解决方案
- C#多线程操作界面控件的解决方案
- C#多线程操作界面控件的解决方案
- C#多线程操作界面控件的解决方案
- C#多线程操作界面控件的解决方案
- C#多线程操作界面控件的解决方案
- C#子窗口改变父类窗口的控件 WPF WinForm
- [Android ] 多线程操作中更新UI控件的方法
- 超简单,三步就能在WPF里面多线程访问UI线程、主线程的控件
- linux/Unix 共享内存 mmap() 函数使用的一个问题
- 探讨 NULL、0、nullptr的意义
- python的输入输出方式
- ios判断系统是24小时制还是12小时制
- 牛顿--现在流行胡诌
- c# wpf下的多线程操作窗口UI控件的过程
- C++ map的基本操作和用法
- 【交互设计】如何描述你的产品
- thinkphp之phpmail发邮件
- IOS页面跳转的三种方式
- 机器视觉代码集合
- 工作中经常用到的C#编程小技巧
- Distinct Subsequences
- 【交互设计】如何描述你的产品