最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析OpenXml?Pptx的邊框虛線轉(zhuǎn)為WPF的邊框虛線問題

 更新時間:2021年12月29日 08:33:47   作者:RyzenAdorer  
這篇文章主要介紹了OpenXml?Pptx的邊框虛線轉(zhuǎn)為WPF的邊框虛線,在文中用PPTX的7種直線,分別設(shè)置7種能夠設(shè)置的虛線類型,具體實例代碼跟隨小編一起看看吧

安裝Openxml sdk

首先,我們先安裝nuget的需要的有關(guān)的Openxml sdk,我們開源了解析pptx的Openxml拍平層,下面兩種方式都可以安裝:

nuget包管理器控制臺:

Install-Package dotnetCampus.DocumentFormat.OpenXml.Flatten -Version 2.0.0

csproj引用:

<PackageReference Include="dotnetCampus.DocumentFormat.OpenXml.Flatten" Version="2.0.0" />

解析Pptx

我這里用PPTX的7種直線,分別設(shè)置7種能夠設(shè)置的虛線類型,PPTX的顯示效果是這樣的:

然后解析代碼如下,解析主要邏輯部分:

        private void PptxToGeometry(string filePath)
        {
            if (!File.Exists(filePath) || !filePath.EndsWith(".pptx", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            var lines = new List<Line>();
            using var presentationDocument = PresentationDocument.Open(filePath, false);
            var presentationPart = presentationDocument.PresentationPart;
            var presentation = presentationPart?.Presentation;
            var slideIdList = presentation?.SlideIdList;
            if (slideIdList == null)
            {
                return;
            }
            foreach (var slideId in slideIdList.ChildElements.OfType<SlideId>())
            {
                var slidePart = (SlidePart)presentationPart.GetPartById(slideId.RelationshipId);
                var slide = slidePart.Slide;
                foreach (var shapeProperties in slide.Descendants<ShapeProperties>())
                {
                    var presetGeometry = shapeProperties.GetFirstChild<PresetGeometry>();
                    if (presetGeometry != null && presetGeometry.Preset.HasValue)
                    {
                        if (presetGeometry.Preset == ShapeTypeValues.StraightConnector1)
                        {
                            var transform2D = shapeProperties.GetFirstChild<Transform2D>();
                            var extents = transform2D?.GetFirstChild<Extents>();
                            if (extents != null)
                            {
                                var width = new Emu(extents.Cx!.Value).ToPixel().Value;
                                var height = new Emu(extents.Cy!.Value).ToPixel().Value;


                                var presetDash = shapeProperties.GetFirstChild<Outline>()?.GetFirstChild<PresetDash>()?.Val;
                                var dashArray = GetDashArrayByPresetLineDashValues(presetDash);
                                var line = ConverterToGeometry( width, height, dashArray); 
                                lines.Add(line);
                            }
                        }
                    }
                }
            }

            this.ListBox.ItemsSource = lines;
        }

PPTX映射成WPF虛線的方法:

        private DoubleCollection GetDashArrayByPresetLineDashValues(PresetLineDashValues presetLineDashValues)
        {
            DoubleCollection dashStyle = presetLineDashValues switch
            {
                PresetLineDashValues.Solid => new(),
                PresetLineDashValues.Dot => new() { 0, 2 },
                PresetLineDashValues.Dash => new() { 3, 3 },
                PresetLineDashValues.LargeDash => new() { 8, 3 },
                PresetLineDashValues.DashDot => new() { 3, 3, 1, 3 },
                PresetLineDashValues.LargeDashDot => new() { 7.5, 3.5, 1, 3.5 },
                PresetLineDashValues.LargeDashDotDot => new() { 8, 3, 1, 3, 1, 3 },
                PresetLineDashValues.SystemDash => new() { 3, 1 },
                PresetLineDashValues.SystemDot => new() { 1, 1 },
                PresetLineDashValues.SystemDashDot => new() { 2, 2, 0, 2 },
                PresetLineDashValues.SystemDashDotDot => new() { 2, 2, 0, 2 },
                _ => new DoubleCollection()
            };
            return dashStyle;
        }

最終繪制線條的方法:

        private Line ConverterToGeometry(double width, double height, DoubleCollection dashDoubleCollection)
        {
            var line = new Line
            {
                X1 = 0,
                Y1 = 0,
                X2 = width,
                Y2 = height,
                StrokeDashArray = dashDoubleCollection,
                Stroke = Stroke,
                StrokeThickness = StrokeThickness
            };
            return line;
        }

最終的效果:

我們可以看到幾乎是接近的效果了,當(dāng)然你也可以根據(jù)我的代碼去微調(diào)更精確的值,只需要稍微改下GetDashArrayByPresetLineDashValues方法內(nèi)相對應(yīng)的值即可

后話

實際上,openxml文檔是給出了PresetDash的值的,大致如下:

但是其值跟WPF的設(shè)置Dash的DoubleCollection不對應(yīng),因此以上的映射值都是我自己微調(diào)的

源碼

BlogCodeSample/PptDashConverToWpfSample at main · ZhengDaoWang/BlogCodeSample

到此這篇關(guān)于OpenXml?Pptx的邊框虛線轉(zhuǎn)為WPF的邊框虛線的文章就介紹到這了,更多相關(guān)Pptx邊框虛線轉(zhuǎn)為WPF的邊框虛線內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#異常處理的最佳實踐與內(nèi)存模型深度剖析

    C#異常處理的最佳實踐與內(nèi)存模型深度剖析

    C#提供了強大的異常處理機制,它幫助開發(fā)者捕獲并響應(yīng)運行時的錯誤,然而,異常的處理不僅僅是捕獲錯誤,它還需要合理的策略來確保代碼的性能、可維護(hù)性和可靠性,本文將深入探討C#異常處理的最佳實踐,如何有效記錄日志,避免性能損失,并對C#的內(nèi)存模型做詳細(xì)解析
    2025-01-01
  • C#實現(xiàn)獲取磁盤空間大小的方法

    C#實現(xiàn)獲取磁盤空間大小的方法

    這篇文章主要介紹了C#實現(xiàn)獲取磁盤空間大小的方法,分別基于System.IO.DriveInfo.GetDrives方法與ManagementClass("Win32_LogicalDisk")來實現(xiàn)這一功能,是非常實用的技巧,需要的朋友可以參考下
    2014-12-12
  • C#中限制并發(fā)任務(wù)數(shù)量的高效方法與技巧分享

    C#中限制并發(fā)任務(wù)數(shù)量的高效方法與技巧分享

    在C#中,處理并發(fā)操作是一項常見且強大的功能,尤其是在需要執(zhí)行多個任務(wù)但又希望限制同時運行任務(wù)數(shù)量的場景中,本文將深入探討幾種有效的方法來限制C#中的并發(fā)任務(wù)數(shù)量,并通過具體的應(yīng)用場景和示例代碼展示如何實現(xiàn)這些方法,需要的朋友可以參考下
    2024-12-12
  • C#實現(xiàn)Socket服務(wù)器及多客戶端連接的方式

    C#實現(xiàn)Socket服務(wù)器及多客戶端連接的方式

    這篇文章介紹了C#實現(xiàn)Socket服務(wù)器及多客戶端連接的方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • C#多線程學(xué)習(xí)之Thread、ThreadPool、Task、Parallel四者區(qū)別

    C#多線程學(xué)習(xí)之Thread、ThreadPool、Task、Parallel四者區(qū)別

    這篇文章主要以一些簡單的小例子,簡述多線程的發(fā)展歷程:Thread,ThreadPool,Task,Parallel。文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#多線程有一定幫助,需要的朋友可以參考一下
    2021-12-12
  • C#?winform實現(xiàn)中英文切換功能的四種方式

    C#?winform實現(xiàn)中英文切換功能的四種方式

    這篇文章主要介紹了在C#?winform應(yīng)用程序中實現(xiàn)中英文切換功能的四種方式,資源文件(Resources),本地化(Localization),動態(tài)設(shè)置控件字體和切換語言環(huán)境這四種方式,下面將詳細(xì)介紹每種方式及其具體實現(xiàn),并討論它們的優(yōu)缺點,需要的朋友可以參考下
    2024-04-04
  • C#如何檢測操作系統(tǒng)版本

    C#如何檢測操作系統(tǒng)版本

    這篇文章主要為大家詳細(xì)介紹了C#如何檢測操作系統(tǒng)版本的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C#中類與結(jié)構(gòu)的區(qū)別實例分析

    C#中類與結(jié)構(gòu)的區(qū)別實例分析

    這篇文章主要介紹了C#中類與結(jié)構(gòu)的區(qū)別,類與結(jié)構(gòu)是C#初學(xué)者比較輕易混淆的概念,本文加以實例說明,需要的朋友可以參考下
    2014-08-08
  • C#中Winform窗體Form的關(guān)閉按鈕變灰色的方法

    C#中Winform窗體Form的關(guān)閉按鈕變灰色的方法

    這篇文章主要介紹了C#中Winform窗體Form的關(guān)閉按鈕變灰色的方法,對于C#程序界面的設(shè)計有一定的借鑒價值,需要的朋友可以參考下
    2014-08-08
  • C# WinForm調(diào)用Shell_NotifyIcon的示例代碼

    C# WinForm調(diào)用Shell_NotifyIcon的示例代碼

    這篇文章主要介紹了C# WinForm調(diào)用Shell_NotifyIcon的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11

最新評論

枣阳市| 体育| 巫溪县| 凉城县| 镇巴县| 绥化市| 青岛市| 丰顺县| 铜川市| 吉隆县| 松滋市| 驻马店市| 江北区| 长寿区| 潢川县| 钟山县| 舞钢市| 新巴尔虎右旗| 木里| 罗江县| 阳新县| 行唐县| 宜兰县| 许昌县| 五台县| 大埔县| 时尚| 海口市| 霍林郭勒市| 康保县| 枝江市| 迭部县| 铁岭市| 贺州市| 尖扎县| 康保县| 济阳县| 渑池县| 庆城县| 保德县| 乌拉特中旗|