RFID设备管理C#客户端学习笔记之2:跨线程调用和动态绑定

将WinForm编程下socket代码简单移植过来之后出现跨线程调用问题,用委托解决之后又出现应用程序长时间不响应以及异常

“System.Reflection.TargetParameterCountException”类型的未经处理的异常在 mscorlib.dll 中发生

问题在于同样的代码在From下是可以正常运行的,所以WPF路线算是前功尽弃了,略坑爹……but thats life 梳理一下有用的2个知识点吧,接下来会在Form应用程序继续开发

占位

1、跨线程调用

Form下只要在InitializeComponent();后面加一句Control.CheckForIllegalCrossThreadCalls = false;即可搞定 在WPF应用程序中却比较麻烦。以添加数据到RichTextBox中为例: 首先创建更改主界面UI的方法

	/// <summary>
    /// 将data添加到RTB中,调用方负责传递控件name
    /// </summary>
    /// <param name="rtb"></param>
    /// <param name="data"></param>
    private void updateFun_rtb(RichTextBox rtb, string data)
    {
        rtb.AppendText(data);
        //this.rtb_show.Focus();
    }

在初始化的时候创建委托 Action updateAction_rtb = new Action<RichTextBox, string>(updateFun_rtb); 在线程乱飞的方法中插入这句 Dispatcher.BeginInvoke(updateAction_rtb, this.rtb_show, data); 就ok啦

2、动态绑定

要实现下拉列表选择指令名称,TextBox自动填充相应的指令内容。

2.1、绑定ComboBox的数据源

WPF中可以在后台直接指定ComboBox控件的ItemsSource属性,WinForm中只能用Add()逐条添加。 首先添加namespace:System.Collections.ObjectModel;; 接着新建ReaderCMD类

//属性或者字段一定要是public,这样xaml才可以访问到
//ref:http://blog.csdn.net/WaitForFree/article/details/8663611

class ReaderCMD:ObservableCollection<string>
    {
        public string Name { get; set; }
        public string Code { get; set; }
        public ReaderCMD(string name, string code)
        {
            this.Name = name;
            this.Code = code;
        }
    }
        

最后添加数据源

	//定义指令组合
	List<ReaderCMD> cmds = new List<ReaderCMD>();
	cmds.Add(new ReaderCMD("设备识别", "A0 03 82 00 DB"));
	cmds.Add(new ReaderCMD("复位读头", "A0 03 65 00 F8"));
	cmds.Add(new ReaderCMD("停止工作", "A0 03 50 00 0D"));
	cmds.Add(new ReaderCMD("关闭继电器", "A0 04 B1 00 00 AB"));
	cmds.Add(new ReaderCMD("打开继电器", "A0 04 B1 00 01 AB"));
	//绑定命令下拉框
	this.cb_cmdChoice.ItemsSource = cmds;       
<ComboBox Name="cb_cmdChoice" Canvas.Left="36" Canvas.Top="115" Width="158"
                                  IsEditable="True" IsReadOnly="True" Text="选择命令"
                                  DisplayMemberPath="Name"></ComboBox>

ok啦

2.2、绑定TextBox

为tb_cmd的Text属性添加绑定

 <TextBox Name="tb_cmd" Canvas.Left="36" Canvas.Top="157" Width="268"
                     Text="{Binding Path=Code}"
                     ></TextBox>

为它的父级容器添加DataContext属性

<Canvas DataContext="{Binding ElementName=cb_cmdChoice,Path=SelectedItem}">     

TextBox会向上层寻找DataContext,这样就ok啦

这个Thinker-md效果不错嘛~~

输入图片说明 但是代码为什么还是没有行号。。 Thinker-md编辑界面的显示效果很不错,但发布之后的效果略不堪,还是用回UEditor吧。。

转载于:https://my.oschina.net/SnifferApache/blog/413047

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值