前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UNO 设置平台进入全屏窗口模式的方法

UNO 设置平台进入全屏窗口模式的方法

作者头像
林德熙
发布2024-02-25 10:14:39
790
发布2024-02-25 10:14:39
举报
文章被收录于专栏:林德熙的博客林德熙的博客

本文记录在 UNO Platform 的桌面窗口项目里,进入和退出全屏窗口的方法,此方法包括 UNO 的 WPF 和 GTK 和 WinUI 版本的实现

实现思路,添加抽象的 IPlatformProvider 接口,在接口里面分别添加进入全屏和退出全屏的方法,如以下代码,接着再分别在 Skia.GTK 和 Skia.WPF 和 WinUI 上实现对接方法。所谓跨平台,就是各个平台都实现一遍

代码语言:javascript
复制
public interface IPlatformProvider
{
    void EnterFullScreen();
    void ExitFullScreen();
}

为了方便让 UNO 统一平台的项目可以方便使用,再定义一个静态类,用于注入 IPlatformProvider 的各个平台的实现

代码语言:javascript
复制
public static class PlatformHelper
{
    public static IPlatformProvider? PlatformProvider
    {
        get => _platformProvider;
        set
        {
            if (_platformProvider != null)
            {
                throw new InvalidOperationException("PlatformProvider can only be set once");
            }

            _platformProvider = value;
        }
    }

    private static IPlatformProvider? _platformProvider;
}

以下是各个平台的具体实现

在 WPF 平台下的实现,我使用的是 WPF 稳定的全屏化窗口方法 博客里面提供的方式进行全屏,以下代码省略 FullScreenHelper 的代码,大家可以在本文末尾获取到全部代码

代码语言:javascript
复制
public class PlatformProvider : IPlatformProvider
{
    public PlatformProvider(Window window)
    {
        _window = window;
    }

    private readonly Window _window;

    public void EnterFullScreen()
    {
        FullScreenHelper.StartFullScreen(_window);
    }

    public void ExitFullScreen()
    {
        FullScreenHelper.EndFullScreen(_window);
    }
}

对接的代码放在 AppHead.xaml.cs 的 OnLaunched 方法里面,如以下代码

代码语言:javascript
复制
    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
        base.OnLaunched(args);
        PlatformHelper.PlatformProvider = new PlatformProvider(MainWindow!);
        MainWindow.SetWindowIcon();
    }

由于 AppHead.xaml.cs 是与 WinUI 共用的代码,因此我这里推荐将 PlatformProvider 的定义的命名空间保持 WPF 和 WinUI 项目相同

下面是 WinUI 项目里面的定义,代码如下

代码语言:javascript
复制
internal class PlatformProvider : IPlatformProvider
{
    public PlatformProvider(Window window)
    {
        _window = window;
    }

    private readonly Window _window;

    public void EnterFullScreen()
    {
        _window.AppWindow.SetPresenter(AppWindowPresenterKind.FullScreen);
    }

    public void ExitFullScreen()
    {
        _window.AppWindow.SetPresenter(AppWindowPresenterKind.Default);
    }
}

由于 WinUI 和 WPF 共用 AppHead.xaml.cs 的代码,在 WPF 里面已经完成了注入平台实现的逻辑,因此在 WinUI 项目里面只需要完成以上定义即可

最后是 GTK 项目的平台定义,代码如下

代码语言:javascript
复制
public class GtkPlatformProvider : IPlatformProvider
{
    public GtkPlatformProvider(GtkHost gtkHost)
    {
        _gtkHost = gtkHost;
    }

    private readonly GtkHost _gtkHost;

    public void EnterFullScreen()
    {
        _gtkHost.Window?.Fullscreen();
    }

    public void ExitFullScreen()
    {
        _gtkHost.Window?.Unfullscreen();
    }
}

对应的 GTK 对接代码如下

代码语言:javascript
复制
    public static void Main(string[] args)
    {
        ExceptionManager.UnhandledException += delegate (UnhandledExceptionArgs expArgs)
        {
            Console.WriteLine("GLIB UNHANDLED EXCEPTION" + expArgs.ExceptionObject.ToString());
            expArgs.ExitApplication = true;
        };

        var host = new GtkHost(() => new AppHead());
        PlatformHelper.PlatformProvider = new GtkPlatformProvider(host);
        host.Run();
    }

以上代码就完成了 UNO 的 WPF 和 GTK 和 WinUI 桌面平台的窗口全屏的实现。为了测试效果,进入 MainPage.xaml 里面添加一个 ToggleButton 按钮,用来控制进入和退出全屏,界面代码如下

代码语言:javascript
复制
    <ToggleButton x:Name="FullScreenButton" HorizontalAlignment="Center" VerticalAlignment="Center" Click="FullScreenButton_OnClick">全屏</ToggleButton>

后台代码如下

代码语言:javascript
复制
    private void FullScreenButton_OnClick(object sender, RoutedEventArgs e)
    {
        var toggleButton = (ToggleButton) sender;
        if (toggleButton.IsChecked is true)
        {
            PlatformHelper.PlatformProvider?.EnterFullScreen();
        }
        else
        {
            PlatformHelper.PlatformProvider?.ExitFullScreen();
        }
    }

完成代码之后,分别切换到 UNO 的 WPF 和 GTK 和 WinUI 平台上,进行构建和运行项目。测试点击全屏按钮时,是否能够符合预期的进入和退出全屏模式

代码放在 githubgitee 上,可以使用如下命令行拉取代码

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

代码语言:javascript
复制
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin f7eeba9cff79ba5f5f576d6b5454e5c55dceb037

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码

代码语言:javascript
复制
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin f7eeba9cff79ba5f5f576d6b5454e5c55dceb037

获取代码之后,进入 RalllawfairlekolairHemyiqearkice 文件夹,即可获取到源代码

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com