【Win10】一些零碎不好歸檔的小總結(原諒我這個該死的標題吧)


一、同步方式獲取設備的屏幕分辨率

public static class ScreenResolution
{
    /// <summary>
    /// 獲取屏幕高度。
    /// </summary>
    public static int Height
    {
        get
        {
            var rect = PointerDevice.GetPointerDevices().Last().ScreenRect;
            var scale = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
            return (int)(rect.Height * scale);
        }
    }

    /// <summary>
    /// 獲取屏幕寬度。
    /// </summary>
    public static int Width
    {
        get
        {
            var rect = PointerDevice.GetPointerDevices().Last().ScreenRect;
            var scale = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
            return (int)(rect.Width * scale);
        }
    }
}

最初思路來源:http://bbs.wfun.com/thread-860192-1-1.html

測試結果:

Desktop(device Win10 10240)
Correct Value:1920x1080
Test Result:1920x1080

Mobile(emulator W10M 10240 WXGA 4.5 inch)
Correct Value:768x1280
Test Result:768x1280

Mobile(emulator W10M 10240 WVGA 4 inch)
Correct Value:480x800
Test Result:480x854

只有最后一個是不相等的,個人認為是因為虛擬導航欄的原因,因此我覺得該代碼理論上是沒有問題的,可以投入生產環境。

當然如果不放心的話也可以使用 Win32 API 來獲取屏幕分辨率。(已驗證此 API 不能在商店應用包中使用,謝謝 @flashcancer 指出)

[DllImport("user32.dll")]
public static extern int GetSystemMetrics(SystemMetric smIndex);
int x = GetSystemMetrics(SystemMetric.SM_CXSCREEN);
int y = GetSystemMetrics(SystemMetric.SM_CYSCREEN);

SystemMetric 是一個枚舉類型,定義可以參見:http://pinvoke.net/default.aspx/Enums.SystemMetric

獲取出來的結果跟上面 Test Result 是一樣的,並且該 API 在 desktop 和 mobile 都可以用。(然而商店不能用,所以然並卵)

商店中允許使用的 Win32 API 一覽:https://msdn.microsoft.com/zh-cn/library/windows/apps/jj662956(v=vs.105).aspx(該鏈接是 WP8 的,但 Win10 應該也差不多)

二、運行時訪問 Package.appxmanifest 文件

有些數據是寫在 Package.appxmanifest 文件里的,例如磁貼用的圖片、啟動屏幕用的圖片,運行時獲取這些信息就只能訪問 Package.appxmanifest 文件了。

string manifestPath = Path.Combine(Package.Current.InstalledLocation.Path, "AppxManifest.xml");
XDocument document = XDocument.Load(manifestPath);

編譯后,解包我們得知是會變成 AppxManifest.xml 文件,接下來用 XDocument 或者 XmlDocument 解釋就可以了。

manifest 的 schema 文檔地址:https://msdn.microsoft.com/zh-cn/library/windows/apps/dn934760.aspx

三、獲取 GB2312 Encoding

以前 WP8.1 沒記錯是得到 codeplex 上找這個 Encoding 的,現在不用了。

// 這兩句執行一次就可以了,當然重復執行也沒壞的。
EncodingProvider provider = CodePagesEncodingProvider.Instance;
Encoding.RegisterProvider(provider);

Encoding gb2312 = Encoding.GetEncoding("gb2312");

// 拋出 ArgumentException
// Encoding doge = Encoding.GetEncoding("doge");

前兩句可以放在 App.cs(當然某些人手賤將入口點改成別的也沒大問題)里。執行一次就已經可以了。接下來就可以獲取 Encoding 了,當然前提是你機子上有這個 Encoding,沒有的話就像上面 doge 那樣拋出一個 ArgumentException。

四、獲取主題色(AccentColor)

public static Color AccentColor
{
    get
    {
        return new UISettings().GetColorValue(UIColorType.Accent);
    }
}

UIColorType 是一個枚舉類型,里面還有 Background 的顏色之類的。

當然繼續沿用 WP8.1 的方法也可,通過 Resource 來獲取,只不過 Win10 里的 ResourceKey 變了。

2015/9/23 更新:

上面該方式僅能在 Desktop 下使用,Mobile 會拋異常。

public static Color AccentColor
{
    get
    {
        return (Color)Application.Current.Resources["SystemAccentColor"];
    }
}

所以還是用回 Resource 來獲取吧。。。

五、App.cs 里的 Launched 和 Actived 有啥區別

一圖流不解釋。

應用生命周期Ex

之前周末休息整理的,不整理不知道,原來這么亂。話說好久沒用 Paint.Net 有點不習慣。

此圖乃個人整理,請勿當真,如有錯漏,請在評論指出。


最后希望工作的面試能過,順利拿到 offer,然后早點交接完辭掉現在這份好好休息幾天(最近感覺有點累)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM