国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

.NET 創(chuàng)建無邊框的跨平臺應(yīng)用

這篇具有很好參考價值的文章主要介紹了.NET 創(chuàng)建無邊框的跨平臺應(yīng)用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

.NET 創(chuàng)建無邊框的跨平臺應(yīng)用

在創(chuàng)建了Photino應(yīng)用程序以后我們發(fā)現(xiàn)它自帶了一個標題欄,并且非常丑,我們現(xiàn)在要做的就是去掉這個很丑的自帶標題欄,并且自定義一個更好看的,下面我們將用Masa Blazor提供的模板去進行實戰(zhàn)。

安裝模板

安裝Masa Blazor提供的rc2的模板

dotnet new install Masa.Template::1.0.0-rc.2

創(chuàng)建項目

  • 打開VS2022 => 新建項目
  • 搜索到一下類別!
  • 然后創(chuàng)建Gotrays名稱的項目

項目結(jié)構(gòu)

無邊框處理

修改Program.cs代碼,增加SetChromeless,設(shè)置無邊框

using Gotrays;
using Microsoft.Extensions.DependencyInjection;
using Photino.Blazor;

internal class Program
{
    [STAThread]
    private static void Main(string[] args)
    {
        var appBuilder = PhotinoBlazorAppBuilder.CreateDefault(args);

        appBuilder.RootComponents.Add<App>("#app");
        appBuilder.Services.AddMasaBlazor();

        var app = appBuilder.Build();

        app.MainWindow
            .SetTitle("Photino Blazor Sample")
            .SetChromeless(true);

        AppDomain.CurrentDomain.UnhandledException += (sender, error) =>
        {
        };

        app.Run();
    }
}

啟動以后的效果:

這樣就完成了我們的無邊框,但是也并不是直接可以使用,你會發(fā)現(xiàn)它無法拖動!下面我們將讓他可以被拖動

完善無邊框拖動

我們需要支持拖動我們的標題欄的時候帶動我們的窗口!

下面開始修改代碼實現(xiàn)這個邏輯

我們的標題欄的css的樣式是m-app-bar

打開wwwroot/index.html并且修改為以下代碼

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8" />
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
    <title>Gotrays</title>
    <base href="/" />
    <link href="_content/Masa.Blazor/css/masa-blazor.min.css" rel="stylesheet">
    <link href="css/app.css" rel="stylesheet" />
    <link href="Gotrays.styles.css" rel="stylesheet" />
    <link  rel="stylesheet">
    <link  rel="stylesheet">
    <link  rel="stylesheet">
    <style>
        #app .m-app-bar {
            -webkit-app-region: drag;
        }

        html {
            overflow: hidden;
        }
    </style>
</head>

<body>

    <div class="status-bar-safe-area"></div>
    <div id="app">Loading...</div>

    <div id="blazor-error-ui">
        An unhandled error has occurred.
        <a href="" class="reload">Reload</a>
        <a class="dismiss">??</a>
    </div>

    <script src="_framework/blazor.webview.js"></script>
    <script src="_content/BlazorComponent/js/blazor-component.js"></script>

    <script>
        let start = false;
        let pageX = 0;
        let pageY = 0;
        document.body.addEventListener('mousedown', evt => {
            const { target } = evt;
            const appRegion = getComputedStyle(target)['-webkit-app-region'];
            const app = document.getElementById("m-app-bar");
            app.addEventListener('mousemove', onmousemove)

            app.addEventListener("mousedown", (e) => {
                console.log(e.pageX, e.pageY);
                pageX = e.pageX;
                pageY = e.pageY;
                start = true;
            })

            app.addEventListener("mouseup", (e) => {
                start = false;
            })

            console.log("MouseDownDrag", evt, appRegion, app);
            if (appRegion === 'drag') {
                var data = {
                    Command: "MouseMove",
                    Data: {

                    }
                }
                evt.preventDefault();
                evt.stopPropagation();
            }
        });

        function onmousemove(e) {
            if (start) {
                console.log("MouseMove", e);
                var data = {
                    "Command": "MouseMove",
                    X: e.clientX - pageX,
                    Y: e.clientY - pageY
                }
                window.external.sendMessage(JSON.stringify(data));
            }

        }

    </script>
</body>

</html>

主要是添加了這個樣式文件,注意的是這個相當于標記了哪個可以拖動我們的窗口的標記

    <style>
        #app .m-app-bar {
            -webkit-app-region: drag;
        }

        html {
            overflow: hidden;
        }
    </style>

下面的js的代碼是為了傳遞窗口拖動參數(shù)實現(xiàn)實際的拖動


    <script>
        let start = false;
        let pageX = 0;
        let pageY = 0;
        document.body.addEventListener('mousedown', evt => {
            const { target } = evt;
            const appRegion = getComputedStyle(target)['-webkit-app-region'];
            const app = document.getElementById("m-app-bar");
            app.addEventListener('mousemove', onmousemove)

            app.addEventListener("mousedown", (e) => {
                console.log(e.pageX, e.pageY);
                pageX = e.pageX;
                pageY = e.pageY;
                start = true;
            })

            app.addEventListener("mouseup", (e) => {
                start = false;
            })

            console.log("MouseDownDrag", evt, appRegion, app);
            if (appRegion === 'drag') {
                var data = {
                    Command: "MouseMove",
                    Data: {

                    }
                }
                evt.preventDefault();
                evt.stopPropagation();
            }
        });
        function onmousemove(e) {
            if (start) {
                console.log("MouseMove", e);
                var data = {
                    "Command": "MouseMove",
                    X: e.clientX - pageX,
                    Y: e.clientY - pageY
                }
                window.external.sendMessage(JSON.stringify(data));
            }
        }

    </script>

修改Program.cs文件的代碼支持拖動

using System.Diagnostics;
using Gotrays;
using Microsoft.Extensions.DependencyInjection;
using Photino.Blazor;
using PhotinoNET;
using System.Runtime.InteropServices;
using System.Text.Json;

internal class Program
{
    [STAThread]
    private static void Main(string[] args)
    {
        var appBuilder = PhotinoBlazorAppBuilder.CreateDefault(args);

        appBuilder.RootComponents.Add<App>("#app");
        appBuilder.Services.AddMasaBlazor();

        var app = appBuilder.Build();

        app.MainWindow

            .SetTitle("Photino Blazor Sample")
            .SetChromeless(true)
            .RegisterWebMessageReceivedHandler(MessageReceived);

        AppDomain.CurrentDomain.UnhandledException += (sender, error) =>
        {
        };

        app.Run();
    }

    private static void MessageReceived(object? sender, string message)
    {
        var window = sender as PhotinoWindow;
        if (message.StartsWith("{"))
        {
            var data = JsonSerializer.Deserialize<Message>(message);

            if (data == null || data.Command != "MouseMove") return;

            var left = window.Left + data.X;
            var top = window.Top + data.Y;
            if (left <= -window.Width / 2)
            {
                left = -window.Width / 2;
            }

            if (window.Top < 0)
            {
                window.Top = 0;
            }

            window.SetLeft((int)((int)left));
            window.SetTop((int)((int)top));
        }
    }

}

public class Message
{
    public string Command { get; set; }

    public double X { get; set; }

    public double Y { get; set; }
}

代碼實現(xiàn)邏輯

  • 首先需要定義css樣式,這個是相當于指定了哪個元素可以被拖動

    #app .m-app-bar {
                -webkit-app-region: drag;
            }
    
  • 然后定義js腳本,通過js去監(jiān)聽拖動的事件然后計算坐標,將計算好的坐標傳遞到c#的事件中完成實際的窗體拖動事件

            let start = false;
            let pageX = 0;
            let pageY = 0;
            document.body.addEventListener('mousedown', evt => {
                const { target } = evt;
                const appRegion = getComputedStyle(target)['-webkit-app-region'];
                const app = document.getElementById("m-app-bar");
                app.addEventListener('mousemove', onmousemove)
    
                app.addEventListener("mousedown", (e) => {
                    pageX = e.pageX;
                    pageY = e.pageY;
                    start = true;
                })
    
                app.addEventListener("mouseup", (e) => {
                    start = false;
                })
    
                if (appRegion === 'drag') {
                    var data = {
                        Command: "MouseMove",
                        Data: {
    
                        }
                    }
                    evt.preventDefault();
                    evt.stopPropagation();
                }
            });
            function onmousemove(e) {
                if (start) {
                    console.log("MouseMove", e);
                    var data = {
                        "Command": "MouseMove",
                        X: e.clientX - pageX,
                        Y: e.clientY - pageY
                    }
                    window.external.sendMessage(JSON.stringify(data));
                }
            }
    

    當id為m-app-bar的元素被鼠標按下的時候?qū)τ?code>pageX = e.pageX,pageY = e.pageY,start = true三個值賦值,start 表示鼠標按下并且啟動拖動,pageXpageY則是鼠標首次按下坐標

    當元素被mousedown觸發(fā)將拖動的坐標和首次點擊的坐標相減,然后就可以通過window.external.sendMessage傳遞到c#的代碼塊中,先判斷Message的數(shù)據(jù)是否為json,如果是則轉(zhuǎn)換模型,然后計算設(shè)置實際窗體的位置即可

    
        private static void MessageReceived(object? sender, string message)
        {
            var window = sender as PhotinoWindow;
            if (message.StartsWith("{"))
            {
                var data = JsonSerializer.Deserialize<Message>(message);
    
                if (data == null || data.Command != "MouseMove") return;
    
                var left = window.Left + data.X;
                var top = window.Top + data.Y;
                if (left <= -window.Width / 2)
                {
                    left = -window.Width / 2;
                }
    
                if (window.Top < 0)
                {
                    window.Top = 0;
                }
    
                window.SetLeft((int)((int)left));
                window.SetTop((int)((int)top));
            }
        }
    

    效果

結(jié)尾

來著token的分享

技術(shù)交流群:737776595文章來源地址http://www.zghlxwxcb.cn/news/detail-463299.html

到了這里,關(guān)于.NET 創(chuàng)建無邊框的跨平臺應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • .NET開源、跨平臺的本地日記APP - SwashbucklerDiary

    .NET開源、跨平臺的本地日記APP - SwashbucklerDiary

    今天給大家推薦一個.NET開源、跨平臺的本地日記APP:SwashbucklerDiary「 俠客日記 」。 每個人的心底都有一個俠客,如影隨風,陪你看過一路的風景,記得你所有的精彩。 MAUI Blazor Hybrid Masa Blazor SqlSugar Serilog .NET 多平臺應(yīng)用 UI (.NET MAUI) 是一個跨平臺框架,用于使用 C# 和 XAML 創(chuàng)

    2024年02月08日
    瀏覽(122)
  • .Net 7 Native AOT 單文件 無依賴 跨平臺

    .Net 7 Native AOT 單文件 無依賴 跨平臺

    2022.11.18 Native AOT 正式發(fā)布,不再是 實驗性項目。 .Net 7 Console App WebApi 使用PublishAOT = true,直接編譯 成exe,無rutime依賴,智能裁剪,體積小,啟動快。 環(huán)境: 1.更新VS2022 到最新版本(支持.net 7) 2.VS2022 安裝 使用C++ 桌面開發(fā) ? 踩坑: 1.程序里一些 沒有應(yīng)用到的 方法會被裁剪

    2024年02月04日
    瀏覽(94)
  • 跨平臺圖表:ChartDirector for .NET 7.1 Crack

    跨平臺圖表:ChartDirector for .NET 7.1 Crack

    什么是新的 ChartDirector for .NET 7.0 支持跨平臺使用,但僅限于 .NET 6。這是因為在 .NET 7 中,Microsoft 停止了用于非 Windows 使用的 .NET 圖形庫 System.Drawing.Common。由于 ChartDirector for .NET 7.0 依賴于該庫,因此它不再支持 .NET 7 上的非 Windows 使用。 ChartDirector for .NET 7.1 NuGet 包現(xiàn)在包含一

    2024年02月11日
    瀏覽(102)
  • Net跨平臺UI框架Avalonia入門-安裝和使用

    Net跨平臺UI框架Avalonia入門-安裝和使用

    Avalonia UI是是Net的跨平臺UI框架,支持 Windows、Linux、iOS 和 Android,與Net其他UI框架相比,如WPF(Windows平臺)、MAUI跨平臺控件(Android、iOS、macOS 和 Windows),主要優(yōu)勢是支持Linux。在國產(chǎn)化的需求下,對于C#開發(fā)的程序員,Avalonia適合用來開發(fā)Linux的桌面客戶端。 v11版本已經(jīng)發(fā)布

    2024年02月05日
    瀏覽(94)
  • 一個基于.NET Core開源、跨平臺的倉儲管理系統(tǒng)

    一個基于.NET Core開源、跨平臺的倉儲管理系統(tǒng)

    今天給大家推薦一個基于.NET Core開源、跨平臺的倉儲管理系統(tǒng),數(shù)據(jù)庫支持MSSQL/MySQL:ZEQP.WMS。 倉儲管理系統(tǒng)(Warehouse Management System,WMS)是一種用于管理和控制倉庫操作的軟件系統(tǒng),它可以幫助企業(yè)實現(xiàn)對倉庫內(nèi)物品的跟蹤、存儲、揀選、包裝和發(fā)運等全過程管理,提高倉

    2024年02月21日
    瀏覽(912)
  • golang實現(xiàn)rpc方法一:使用net/rpc庫【不能跨平臺】

    golang實現(xiàn)rpc方法一:使用net/rpc庫【不能跨平臺】

    使用golang官方的net/rpc庫實現(xiàn)RPC方法,使用http作為RPC的載體,通過http/net包監(jiān)聽客戶端連接請求。 rpc服務(wù)端實現(xiàn)代碼serverrpc.go如下 上述服務(wù)端程序運行之后,將會監(jiān)聽本地的8090端口,我們可以實現(xiàn)一個客戶端程序,連接服務(wù)端并且實現(xiàn)RPC方法調(diào)用。 rpc客戶端實現(xiàn)代碼clientr

    2024年01月17日
    瀏覽(91)
  • .NET Core使用SkiaSharp快速生成二維碼( 真正跨平臺方案)

    .NET Core使用SkiaSharp快速生成二維碼( 真正跨平臺方案)

    在.NET 6之前我們一直是使用QRCoder來生成二維碼(QRCoder是一個非常強大的生成二維碼的組件,用到了 System.Drawing.Common ?包),然后從.NET 6開始,當為非 Windows 操作系統(tǒng)編譯引用代碼時,平臺分析器會發(fā)出編譯時警告。異常如下: 由于 System.Drawing.Common 被設(shè)計為 Windows 技術(shù)的精

    2024年01月20日
    瀏覽(105)
  • 跨平臺桌面應(yīng)用小記

    跨平臺桌面應(yīng)用小記

    不管是出于產(chǎn)品定位、多平臺統(tǒng)一亦或是國產(chǎn)化要求。跨平臺都是桌面開發(fā)都是必須要面對的一個課題,下面簡單列舉下主流或一些新興的跨平臺方案,以備后續(xù)使用。 1、Qt Qt是一個跨平臺的C++圖形用戶界面庫,可以部署在Windows、Mac、Linux、嵌入式系統(tǒng)(QNX等)、Android等平

    2024年02月05日
    瀏覽(92)
  • 【微軟技術(shù)?!炕?NET MAUI跨平臺電子白板的設(shè)計與實現(xiàn)

    【微軟技術(shù)棧】基于.NET MAUI跨平臺電子白板的設(shè)計與實現(xiàn)

    1、摘 要 隨著科技的發(fā)展,電子白板功能已經(jīng)普及到視頻會議、在線課堂、企業(yè)、學校乃至其他更多行業(yè)。在多種移動設(shè)備并存的大環(huán)境下,為每個平臺(如:Android、IOS、Windows等)都編寫一套代碼,無論是前期開發(fā)還是后期維護,成本都會增加。另一方面,移動互聯(lián)網(wǎng)經(jīng)過

    2024年02月06日
    瀏覽(111)
  • Net跨平臺UI框架Avalonia入門-安裝和使用(v11版本)

    Net跨平臺UI框架Avalonia入門-安裝和使用(v11版本)

    avalonia v11 版本發(fā)布了,增加了很多新的功能,Avalonia的擴展也同步升級了。 主要更新內(nèi)容: 輔助功能:增加了對各種輔助工具的支持,提高了Avalonia應(yīng)用程序的可用性。 輸入法編輯器(IME)支持:允許在所有語言中使用屏幕鍵盤和輸入。 合成渲染器:提供更強大、高效和靈

    2024年02月09日
    瀏覽(124)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包