WPF疑难杂症之二(全屏幕窗口)

近日的学习中遇到一个非常奇怪的问题:用XAML文件创建了一个全屏幕窗口,然后,在窗口中建立了一个非常简单的动画。一切都在我的掌控之中,实现非常的顺利。

WPF中用XAML创建全屏幕窗口非常简单,只需要简单地设置Window元素的一些属性即可:

<Window x:Class="WindowsApp.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    WindowState="Maximized"

    Topmost="True"    

    WindowStyle="None"

    AllowsTransparency="true"
   
>

    <Grid>

      <!--忽略建立动画的代码-->  

    </Grid>

</Window>

 

最后程序的运行结果却出乎所料,在调用Storyboard.Begin之前,一切都很正常,但是一旦启动动画,程序运行及很慢,鼠标的运动很慢很慢。有兴趣的朋友可以自己尝试一下。

 

如果把窗口Style稍微修改,问题就得到了解决,把WindowStyleNone修改为其它的值似乎都可以正常运行。动画的效率得到了极大的提高。

 

但是我们要的就是全屏幕,那怎么办呢?时间比较紧急,咱就曲线救国绕过去吧!在XAMLWindow属性中WindowStyle保留其默认值,在窗口的加载响应函数里直接用了Win32 API函数来修改窗口的Style。现在可以几乎可以肯定这不像是正统的方法,或者还有其它的还没有了解的知识。修改后的代码如下:

 

<Window x:Class="WindowsApp.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    WindowState="Maximized"

    Topmost="True"    

    Loaded="OnMainLoad"

    >

    <Grid>

      <!--忽略建立动画的代码-->  

    </Grid>

</Window>

 

private void OnMainLoad(object sender, RoutedEventArgs e)

{

int nStyle = Win32API.GetWindowLong(new WindowInteropHelper(this).Handle;,Win32API.GWL_STYLE);

nStyle &= ~Win32API.WS_CAPTION;

Win32API.SetWindowLong(new WindowInteropHelper(this).Handle;, Win32API.GWL_STYLE, nStyle);

}

 

public class Win32API

{

     [DllImport("user32.dll")]

     public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int New);

       

     [DllImport("user32.dll")]

     public  static extern int GetWindowLong(IntPtr hWnd, int nIndex);

}

 

public const int GWL_STYLE = -16;

public const int GWL_EXSTYLE = -20;       

public const int WS_CAPTION = 0x00C00000;

 

代码中使用的WindowInteropHelper类将在后续的随笔中介绍。至于用C#调用Win32 API函数应该不需要进一步的介绍,不熟悉C#的朋友可以参考MSDN中的Interoperability相关内容。
posted @ 2006-12-16 12:21 Yiling Lai 阅读(3431) 评论(7)  编辑 收藏 网摘 所属分类: WPF

  回复  引用  查看    
#1楼 2006-12-16 15:53 | Sheva      
如果有问题,可以到MSDN WPF论坛去问,而且最好要附上repro代码:
http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=119&SiteID=1

Sheva
  回复  引用    
#2楼 2006-12-16 16:15 | 问题 [未注册用户]
看不太明白,你能不能把例子的代码打包让我们下载啊~~
  回复  引用  查看    
#3楼 [楼主]2006-12-16 16:42 | Yiling Lai      
@Sheva

谢谢,因为时间关系,所以先解决问题,还没有深入分析原因!
  回复  引用  查看    
#4楼 [楼主]2006-12-16 16:44 | Yiling Lai      
◎问题

重现问题很简单,只要是任何的3D动画都行,只要你把窗口设置为None并最大化,形成全屏幕窗口即可
  回复  引用  查看    
#5楼 [楼主]2006-12-16 17:58 | Yiling Lai      
补充一下,另外还有一个关键的影响因素:需要把Window的AllowsTranspancy设置为true进行测试。
  回复  引用  查看    
#6楼 [楼主]2006-12-17 19:04 | Yiling Lai      
◎All

根据我在MSDN Forum得到的答案:因为透明(层次)窗口多数时候禁止了硬件加速。帖子的地址在:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1026221&SiteID=1

关于答案可以参考
http://blogs.msdn.com/seema/archive/2006/10/25/layered-windows-sw-is-sometimes-faster-than-hw.aspx

在我仔细学习后如果有必要,用一个单独的Post进行说明!:)
  回复  引用    
#7楼 2008-10-31 23:12 | 学习中。。。 [未注册用户]
请教:进入全屏幕后如何退出全屏幕状态?




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-12-16 21:46 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: