wpf使用问题

在类库中无法使用ConfigurationManager

需要先引用DLL文件:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll

然后才可以使用

System.Configuration.ConfigurationManager.AppSettings["SiteUrl"]

 

WPF的showDialog有关问题

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;    
}

WPF: 再谈ShowDialog,Owner和ShowInTaskbar参数不可少

ShowInTaskbar,当设置好Owner后,如果没有设置ShowInTaskbar为false(默认是true),看似用起来没问题,但是实际上会产生严重的问题。先来列个表,把Owner和ShowInTaskbar参数的影响列举一下,如下:

  没有设置Owner 设置Owner
ShowInTaskbar 
= true
1. 任务栏会有两个窗口 
2. 切换窗口会使父窗口置于子窗口之上 
3. 父窗口无法点击
和左边不同的是:切换窗口后,父窗口不会置于子窗口之上。 
(这里看似还OK,实际上会产生严重的问题!!!)
ShowInTaskbar 
= false
和上面不同的是:任务栏不会有两个窗口,
但是点击任务栏图标后仍然会使父窗口置
于子窗口之上,且父窗口无法点击。
正确的ShowDialog方式!

 

当设置好Owner但是ShowInTaskbar仍为true时,当在任务栏切换其他程序后再次切换到主程序后,会有一定几率出现只有父窗体会显示,且无法点击,子窗体不见了的情况,整个程序变成一种假死的状态,只能通过强行关闭进程方式来结束程序。(在Windows 7上有较大几率出现,其他系统没有试)

  

WPF Image转换为ImageSource

在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;
}

 

 

posted on 2013-04-02 15:03  Daywei  阅读(462)  评论(0编辑  收藏  举报

导航

技术追求卓越 梦想创造未来