Ubuntu 编程 apache centos 云计算 Android shell java mysql Firefox wordpress 程序员 google Windows php nginx 开源 linux 微软 Python

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稍微修改,問題就得到了解決,把WindowStyle的None修改為其它的值似乎都可以正常運行。動畫的效率得到了極大的提高。
 
但是我們要的就是全屏幕,那怎麽辦呢?時間比較緊急,咱就曲線救國繞過去吧!在XAML的Window屬性中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相關內容。

延伸阅读

    评论