需要先引用DLL文件:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll
然后才可以使用
System.Configuration.ConfigurationManager.AppSettings["SiteUrl"]
WPF的showDialog问题最近在做一个数据监测的项目,需求是在主界面实现刷新的同时,可以同步刷新正在打开的曲线图界面,首次执行的时候没有问题,曲线也能实时刷新,但是当我关闭曲线图窗口重新打开时就会报错“关闭 Window 之后,无法设置 Visibility,也无法调用 Show、ShowDialogor 或 WindowInteropHelper.EnsureHandle。”,因为我是在主界面创建的曲线图实例,所以不能在打开之前新建窗口实例,否则就不能实现同步刷新了,我查了资料说重写窗口的Close方法,让窗口在关闭的时候Hide而不是close,代码如下:
/// <summary>
/// 重写Close
/// </summary>
/// <param name="e"></param>
protected override void OnClosed(EventArgs e)
{
this.Hide();
}
但是我重写之后,问题同样存在.------解决方案--------------------
/// <summary>
/// 重写Close
/// </summary>
/// <param name="e"></param>
protected override void OnClosing(EventArgs e)//注意事件的名字,在关闭时,不是关闭后
{
this.Hide();
e.Cancel = true;
}
ShowInTaskbar,当设置好Owner后,如果没有设置ShowInTaskbar为false(默认是true),看似用起来没问题,但是实际上会产生严重的问题。先来列个表,把Owner和ShowInTaskbar参数的影响列举一下,如下:
| 没有设置Owner | 设置Owner |
ShowInTaskbar = true | 1. 任务栏会有两个窗口 2. 切换窗口会使父窗口置于子窗口之上 3. 父窗口无法点击 | 和左边不同的是:切换窗口后,父窗口不会置于子窗口之上。 (这里看似还OK,实际上会产生严重的问题!!!) |
ShowInTaskbar = false | 和上面不同的是:任务栏不会有两个窗口, 但是点击任务栏图标后仍然会使父窗口置 于子窗口之上,且父窗口无法点击。 | 正确的ShowDialog方式! |
当设置好Owner但是ShowInTaskbar仍为true时,当在任务栏切换其他程序后再次切换到主程序后,会有一定几率出现只有父窗体会显示,且无法点击,子窗体不见了的情况,整个程序变成一种假死的状态,只能通过强行关闭进程方式来结束程序。(在Windows 7上有较大几率出现,其他系统没有试)
在WPF中通常图像都是使用图像源的方式“ImageSource”,个别情况我们在编写代码中得到的是一个 Image 对象 这个时候想要将其转换为“ImageSource” 于是就有了下面的代码:
[DllImport("gdi32.dll", SetLastError = true)]
private static extern bool DeleteObject(IntPtr hObject);
//将 Bitmap转换为BitmapSource
//使用过System.Drawing.Bitmap后一定要用DeleteObject释放掉对象,不然内存不释放,很快系统内存就消耗光了。
private static ImageSource BitmapToBitmapSource(Bitmap bitmap)
{
IntPtr hBitmap = bitmap.GetHbitmap();
ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
if (!DeleteObject(hBitmap))//记得要进行内存释放。否则会有内存不足的报错。
{
throw new System.ComponentModel.Win32Exception();
}
return wpfBitmap;
}