Avalonia 11.1 獲取平臺呼叫的視窗的方法

lindexi發表於2024-08-09

本文和大家介紹如何在 11.1 版本的 Avalonia 裡獲取平臺呼叫的視窗的方法,如 Windows 獲取視窗控制代碼,在 Linux 下獲取 X11 的 xid 視窗資訊

在拿到任意的 Avalonia 的 Visual 元素,可透過 TopLevel 的 GetTopLevel 方法獲取到其視窗。由於 Avalonia 是一個跨平臺的 UI 框架,因此不能假定一定存在視窗,於是這裡的 GetTopLevel 只是返回一個名為 TopLevel 的物件

在桌面平臺裡,這裡的 TopLevel 物件就是視窗物件

獲取到 TopLevel 物件之後,即可再呼叫 TryGetPlatformHandle 方法,嘗試獲取平臺資訊,程式碼如下

        var topLevel = TopLevel.GetTopLevel(this)!;

        // 透過視窗獲取,方法更加簡單:
        var handle = topLevel.TryGetPlatformHandle()!;
        Console.WriteLine($"X11 xid {handle.Handle}");

除了以上方法之外,還可以反射 PlatformImpl 獲取。其程式碼實現如下

        var platformImpl = topLevel.PlatformImpl;

        var type = platformImpl.GetType();

        var propertyInfo = type.GetProperty("Handle", BindingFlags.Instance | BindingFlags.Public);

        var value = propertyInfo.GetValue(platformImpl);

        Debug.Assert(value is IPlatformHandle);

        if (value is PlatformHandle platformHandle)
        {
            var x11Handler = platformHandle.Handle;
            Console.WriteLine(x11Handler);
        }
        else if(value is IPlatformHandle platformHandle2)
        {
            // 當前在 Windows 的沒有明確的型別,是一個放在 WindowImpl 類中的 WindowImplPlatformHandle 內部類
            var hwnd = platformHandle2.Handle;
            Console.WriteLine(hwnd);
        }

透過以上程式碼可以看到 Avalonia 實現的不一致,在 Windows 下的實現裡面,沒有明確的 PlatformHandle 型別

好在後續版本已經對此進行變更,允許從 PlatformImpl 屬性直接獲取 Handle 屬性,如此設計將會更加預期。也就是意味著在 11.1 之後的版本,預期可以不用寫反射,即可直接從 PlatformImpl 屬性獲取到 Handle 屬性

以上程式碼使用反射獲取到的 Handle 和 TryGetPlatformHandle 獲取到的是相同的

本文程式碼放在 githubgitee 上,可以使用如下命令列拉取程式碼。我整個程式碼倉庫比較龐大,使用以下命令列可以進行部分拉取,拉取速度比較快

先建立一個空資料夾,接著使用命令列 cd 命令進入此空資料夾,在命令列裡面輸入以下程式碼,即可獲取到本文的程式碼

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 5b958b3dc584ebf34351c4c0015bce17bb5b05d4

以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令列繼續輸入以下程式碼,將 gitee 源換成 github 源進行拉取程式碼。如果依然拉取不到程式碼,可以發郵件向我要程式碼

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 5b958b3dc584ebf34351c4c0015bce17bb5b05d4

獲取程式碼之後,進入 AvaloniaIDemo/NaiqojunefeakeeLurkarlabefije 資料夾,即可獲取到原始碼

更多技術部落格,請參閱 部落格導航

相關文章