WPF 圓型佈局(測量過程)

来源:https://www.cnblogs.com/T-ARF/archive/2020/05/03/12822923.html
-Advertisement-
Play Games

這個例子來自書上。 記錄過程。 主要是數學上極坐標,WPF中的測量過程 簡單來說在一個具有固定軸的坐標系內,一個由原點射出的向量並與固定軸有一定角度且在向量上確定長度的這麼個東西。 可以參考: 知乎https://www.zhihu.com/question/318613418/answer/640 ...


這個例子來自書上。

記錄過程。

主要是數學上極坐標,WPF中的測量過程

簡單來說在一個具有固定軸的坐標系內,一個由原點射出的向量並與固定軸有一定角度且在向量上確定長度的這麼個東西。

可以參考:

知乎https://www.zhihu.com/question/318613418/answer/640194590

B站https://www.bilibili.com/video/BV1Sb411n7FG?t=177

極坐標與直角坐標系轉換。

極坐標中某一點是M,也就是M(ρ,θ)。

將M連接至原點成為一個線段L1,將此線段放置直角坐標系,其中M點變為點M1(X,Y)。

此時我們可以利用三角函數確定X,Y

X=ρ*cosθ=L1*X[點在X軸的垂線坐標]/L1

Y=ρ*sinθ=L1*Y[點在Y軸的垂線坐標]/L1

L1也可以理解為半徑

那麼直角坐標轉換為極坐標則是M(X,Y),同樣我們需使用圓的標準方程(之前的極坐標轉直角中的L1,本來就應該是R【半徑】,不過我不太喜歡這麼快,先用線段,這麼好理解) R2=X2+Y2

另外還有三角函數tan,對邊比鄰邊 ,(坐標系內)y/x

ρ=根號下X2+Y2

θ=tan=y/x

 

剩下就是WPF的測量過程

沒什麼好說,第一步是測量,第二步是排列。

第一步主要是Measure方法,但是主要是通過MeasureOverride方法來確定,這個方法本身是預計UI的大小,Measure是沒有返回值,但是有形參,是這個控制項的父控制項留給這個控制項的可用空間,

如果控制項重寫measureoverride方法,這個方法的形參就是Measure的形參,同時也會和Measure形成遞歸佈局更新,

第二步是Arrange,是最終確認UI控制項的大小,通常是通過ArrageOvrride方法確認,過程和第一步差不多,只不過形參和返回值不同。因為要定位,所以是Rect。

 

對於Measure是父控制項給子控制項賦值通知子控制項你可用大小

MeasureOverride是測量自身大小並返回通知父控制項我預計用這麼大(DesiredSize)

對於Arrange是父控制項決定子控制項的位置和大小

ArrangeOverride是確定自身大小和位置然後返回最終的大小(finalsize【在這之前會有rendersize】)

具體過程還可以參考https://www.cnblogs.com/powertoolsteam/archive/2011/01/10/1932036.html

 

差不多就這麼多

class Test : Panel
    {
        public static readonly DependencyProperty RadiusProperty = DependencyProperty.Register("Radius", typeof(double), typeof(Test), new PropertyMetadata(0.0, new PropertyChangedCallback(OnValueChanged)));
        public double Radius
        {
            get => Convert.ToDouble(GetValue(RadiusProperty));
            set => SetValue(RadiusProperty, value);
        }


        private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            (d as Test).Radius = Convert.ToDouble(e.NewValue);
            (d as Test).InvalidateArrange();
        }
      
        protected override Size MeasureOverride(Size availableSize)
        {
           
            double MaxElementWidth = 0;
            foreach(UIElement item in Children)
            {
//給定子控制項的可用空間 item.Measure(availableSize); MaxElementWidth
= Math.Max(item.DesiredSize.Width, MaxElementWidth); } double PanelWidth = 2 * this.Radius+2 * MaxElementWidth; double width = Math.Min(PanelWidth, availableSize.Width); double height = Math.Min(PanelWidth, availableSize.Height); return new Size(width, height); } protected override Size ArrangeOverride(Size finalSize) { double Degree = 0; double DegreeSrep = (double)360 / this.Children.Count; double X = this.DesiredSize.Width / 2; double Y = this.DesiredSize.Height / 2; foreach(UIElement Item in Children) { //角度轉弧度 double angle = Math.PI * Degree / 180.0; //轉換為直角坐標系 r*cos double x = Math.Cos(angle) * this.Radius; //轉換為直角坐標系 r*sin double y = Math.Sin(angle) * this.Radius; RotateTransform rotate = new RotateTransform(); rotate.Angle = Degree; rotate.CenterX = 0; rotate.CenterY = 0; Item.RenderTransform = rotate; //決定子控制項的位置和大小 Item.Arrange(new Rect(X + x, Y + y, Item.DesiredSize.Width, this.DesiredSize.Height)); Degree += DegreeSrep; } return finalSize; } }

 

xaml

<Grid>
        <local:Test Radius="50">
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
            <TextBlock Text="abc"/>
        </local:Test>
    </Grid>

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Docker的一些概念 docker image docker鏡像 即容器模板,操作系統+軟體運⾏環境+⽤戶程式 類似於安裝操作系統的windows鏡像、centos鏡像,只是一個模板 Docker container docker容器 容器是從鏡像運行的實例,比如用tomcat鏡像運行tomcat ...
  • 一、問題 問題1 場景:如果你未來的丈母娘要求你,第1天給她1分錢,第2天給2分錢,第3天給4分錢,以此類推,每天給前一天的2倍,給1個月(按30天)算就行。問:第30天給多少錢,總共給多少錢? 問題2 場景:如果有兩份工作。 第1份:第1天給你1分錢,第2天給你2分錢,第3天給你4分錢,以此類推, ...
  • 本節常見面試題 如何判斷對象是否死亡(兩種方法)。 簡單的介紹一下強引用、軟引用、弱引用、虛引用(虛引用與軟引用和弱引用的區別、使用軟引用能帶來的好處)。 如何判斷一個常量是廢棄常量 如何判斷一個類是無用的類 堆中幾乎放著所有的對象實例,對堆垃圾回收前的第一步就是要判斷那些對象已經死亡(即不能再被任 ...
  • 1、深拷貝 --> 克隆一份,修改拷貝後的內容不對原對象內容產生影響 拷貝後修改序列中元素內容,註意:被修改的元素不能為一個序列中的某個值 a = [["北京多測師","成都多測師"],"上海多測師","深圳多測師","廣州多測師"] b = a.copy() b[1] = "天津多測師" prin ...
  • 本篇博客接著講解機器視覺的有關技術和知識。包括寬度測量,缺陷檢測,醫學處理。 一:寬度測量 在傳統的自動化生產中,對於尺寸的測量,典型的方法就是千分尺、游標卡尺、塞尺等。而這些測量手段測量精度低、速度慢,無法滿足大規模的自動化生產需求。基於機器視覺的尺寸測量屬於非接觸式的測量,具有檢測精度高、速度快 ...
  • 25. K 個一組翻轉鏈表 題目來源: "https://leetcode cn.com/problems/reverse nodes in k group" 題目 給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。 k 是一個正整數,它的值小於或等於鏈表的長度。 如果節點總數不是 k ...
  • 1、命令行的開始 首先介紹幾個常用到的命令 dotnet --info :查看電腦上環境。 dotnet new --list:查看腳手架模板列表 dotnet new console -n newHelloworld:創建一個名為newHelloworld的控制台程式 dotnet build:切 ...
  • 上一章分析了WPF元素的內部工作元素——允許每個元素插入到WPF佈局系統的MeasureOverride()和ArrangeOverride()方法中。本章將進一步深入分析和研究元素如何渲染自身。 大多數WPF元素通過組合方式創建可視化外觀。換句話說,典型的元素通過其他更基礎的元素進行構建。例如,使 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...