WPF异步加载BitmapImage
在WPF中异步获取HTTP图片并赋值给Image控件,遇到诸多问题,如多线程队列,资源不释放等,最终琢磨出下面的方式:
1 | BackgroundWorker worker = new BackgroundWorker(); |
在WPF中异步获取HTTP图片并赋值给Image控件,遇到诸多问题,如多线程队列,资源不释放等,最终琢磨出下面的方式:
1 | BackgroundWorker worker = new BackgroundWorker(); |
在使用EntityFramework5.0,并将其作为WCF放在服务端的时候遇到了如下问题:
由于将EF放在服务端,所以类必须具有DataContract属性。
服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。
只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember,如下所示。
资源键x:Key用作创建和引用资源的唯一标识,作用类似于名称,常出现在ResourceDictionary中且要求必须为 ResourceDictionary 内的每项定义一个键。
例:
1 | <ResourceDictionary> |
但带有DataType的数据模板DataTemplate和带有TargetType的Style属于特殊情况,他们本身带有隐式键。
使用多线程经常会遇到一个问题,如何停止这个Thread?在WPF中提供了Abort方法,但MSDN却告诉我们:
线程不一定会立即中止,或者根本不中止。 如果线程在作为中止过程的一部分被调用的 finally 块中做非常大量的计算,从而无限期延迟中止操作,则会发生这种情况。
先看下面一段代码:
1 | public partial class MainWindow : Window |
在TabControl中给TabItem定义如下的Template:
1 | <ControlTemplate TargetType="{x:Type TabItem}"> |
实现的效果是给每一个TabItem添加关闭按钮:
现在需要实现关闭按钮的功能,那么则需要在后台Button_Click事件中通过sender找到类型为TabItem的parent。
【安装篇】
PS:在win8.1下可能会遇到安装InstallShield后在VS中看不到”InstallShield Limited Edition Project”,只有“启用InstallShield Limited Edition”的问题,在StackOverFlow中也有人遇到类似问题,我提出并整理这个问题后发现并不是win8.1不能安装InstallShield,从win8.1企业版更换到win8.1专业版后没有出现问题,由于没有继续在win8.1企业版下测试,所以只猜测是win8.1企业版下会出现该问题,或者是由于系统缺失文件,文件被篡改等原因,如果重新安装win8.1企业版仍不能解决,则尝试安装win8.1专业版。
【问题产生】
问题最初是在administrator权限下,visual studio 打开网络磁盘下的文件报错。经过几次调试,最终发现是问题是在管理员权限下,vs无法访问网络磁盘。
Console.Write( System.IO.File.Exists(path));
该结果返回False。为了确认是由于权限问题引起,使用非管理员权限打开vs,运行上面的程序,结果返回True。
至此问题确立:win7/win8下,使用管理员权限打开VisualStudio,无法访问网络磁盘。
首先回顾一下API和C#参数类型的基本对应关系:
需要注意的是这个对应关系是传入参数的对应关系,如果是输出参数,LPSTR和LPCSTR(也就是C/C++里面的char*),对应的就要是StringBuider。
例如:int TEST(char* result)
其中result是输出参数,那么在c#中,就应该使用 int TEST(StringBuider result),而不是ref string,否则会报内存错误。
在WPF中使用ListView经常会用到GridView作为视图,但是却碰到GridViewColumn不能居中对齐的问题,首先想到不使用GridViewColumn的DisplayMemberBinding属性,直接设置DataTemplate,于是尝试修改代码为:
1 | <GridViewColumn.CellTemplate> |
结果还是不行,因为TextBlock的Width是根据Text内容自动调整,没有填充整个单元格,所以需要调整填充样式。方法有两种:
【方案一】
将DataTemplate元素的MinWidth和单元格的ActualWidth绑定,这样就能让DataTemplate元素始终填满单元格:
在一个WCF Service Library中,如果引用了一些32bit的dll,我们称这个WCF Service Library依赖于x86。在调试过程中,也必须将其工程编译属性调整为x86。但如果我们的编译环境是64位,运行可能就会报错BadImageFormatException:
这是因为WCF Service Library是一个dll,必须放在容器中执行,在vs调试中使用了WcfSvcHost.exe来作为一个临时容器。它位于vs安装目录下的Common7\IDE\WcfSvcHost.exe
。由于系统环境是64位,所以安装vs的时候就会自动设置WcfSvcHost.exe为64位,所以当WcfSvcHost.exe运行32位dll时才会报错。解决这个问题可以使用Corflags
命令.
corflags命令的详细介绍可以参考这里。它可以将程序设置在32位下工作:
操作步骤: