将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吧。。