首页 > 代码库 > WINFORM中加入WPF控件并绑定数据源实现跨线程自动更新
WINFORM中加入WPF控件并绑定数据源实现跨线程自动更新
1. WINFORM中添加两个ElementHost,一个放WPF的Button,一个放WPF的TextBox。其中TextBox与数据源绑定,实现跨线程也可以自动更新,而不会出现WINFORM的TextBox控件与数据源绑定后,存在子线程中更新数据源报错(跨线程更新控件)的情况。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows; // 自行添加支持WPF控件using System.Windows.Data; // 自行添加支持WPF控件using System.Windows.Controls; // 自行添加支持WPF控件using System.Windows.Forms;using System.IO.Ports;using System.Net;using System.Net.Sockets;using System.Threading;namespace UI{ public partial class MainForm : Form { public class DataSource : INotifyPropertyChanged { private int _index; public int Index { get { return _index; } set { _index = value; if (PropertyChanged != null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Index")); } } } public event PropertyChangedEventHandler PropertyChanged; } System.Windows.Data.Binding _bind; Thread _thread; DataSource _dataSource; bool _run; public MainForm() { InitializeComponent(); // Create a WPF Button System.Windows.Controls.Button btn = new System.Windows.Controls.Button(); btn.Content = "Button in WPF"; // 修改内容属性 System.Windows.Media.FontFamily font = new System.Windows.Media.FontFamily("Ariel"); // 修改字体属性 btn.FontFamily = font; btn.Click += new System.Windows.RoutedEventHandler(btn_Click); // 增加事件响应 // Add it to ElementHost elementHost1.Child = btn; // Create a WPF TextBox System.Windows.Controls.TextBox txtBox = new System.Windows.Controls.TextBox(); txtBox.Text = "TextBox in WPF"; // 修改内容属性 txtBox.FontFamily = font; _dataSource = new DataSource(); // System.Windows.Data.Binding方式 _bind = new System.Windows.Data.Binding(); _bind.Source = _dataSource; _bind.Path = new PropertyPath("Index"); _bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; txtBox.SetBinding(System.Windows.Controls.TextBox.TextProperty, _bind); // 增加数据源绑定 // Add it to ElementHost elementHost2.Child = txtBox; // 子线程运行 _run = true; _thread = new Thread(Test); _thread.Start(); } void Test() { while (_run) { _dataSource.Index++; Thread.Sleep(100); } } private void btn_Click(object sender, EventArgs e) { System.Windows.Forms.MessageBox.Show("WPF button clicked!"); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { _run = false; if (_thread != null) { _thread.Join(); _thread = null; } } }}
WINFORM中加入WPF控件并绑定数据源实现跨线程自动更新
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。