欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析OpenXml?Pptx的邊框虛線轉為WPF的邊框虛線問題

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

安裝Openxml sdk

首先,我們先安裝nuget的需要的有關的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種直線,分別設置7種能夠設置的虛線類型,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;
        }

最終的效果:

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

后話

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

但是其值跟WPF的設置Dash的DoubleCollection不對應,因此以上的映射值都是我自己微調的

源碼

BlogCodeSample/PptDashConverToWpfSample at main · ZhengDaoWang/BlogCodeSample

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

相關文章

  • C#圖像處理之木刻效果實現(xiàn)方法

    C#圖像處理之木刻效果實現(xiàn)方法

    這篇文章主要介紹了C#圖像處理之木刻效果實現(xiàn)方法,可實現(xiàn)類似木刻效果的黑白照效果,需要的朋友可以參考下
    2015-04-04
  • c# 線程定時器 System.Threading.Timer的使用

    c# 線程定時器 System.Threading.Timer的使用

    本文主要介紹了c# 線程定時器 System.Threading.Timer的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C#中改變DataGridView控件邊框顏色的方法

    C#中改變DataGridView控件邊框顏色的方法

    這篇文章主要介紹了C#中改變DataGridView控件邊框顏色的方法,默認的DataGridView邊框顏色很丑,本文用編程方法實現(xiàn)修改DataGridView邊框顏色,需要的朋友可以參考下
    2014-08-08
  • C#使用protobuf-net進行序列化的詳細操作

    C#使用protobuf-net進行序列化的詳細操作

    本文帶領大家學習C#中protobuf-net工具的另一種使用體驗,這個工具的使用體驗屬于Code-First模式,先定義類型,并使用注解進行標記,不需要先編寫.proto文件,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • c# 實現(xiàn)的支付寶支付

    c# 實現(xiàn)的支付寶支付

    這篇文章主要介紹了c# 實現(xiàn)的支付寶支付的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#多線程系列之手動線程通知

    C#多線程系列之手動線程通知

    本文詳細講解了C#多線程中的手動線程通知,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C#實現(xiàn)讀寫ini文件類實例

    C#實現(xiàn)讀寫ini文件類實例

    這篇文章主要介紹了C#實現(xiàn)讀寫ini文件類,實例分析了C#實現(xiàn)針對ini文件的讀、寫、刪除等操作的常用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#小程序15位轉18位身份證號代碼

    C#小程序15位轉18位身份證號代碼

    現(xiàn)在我們使用的都是18位身份證號,而以前都是15位身份證號,而如何將15位身份證號轉18位身份證號轉換為18位身份證號呢?
    2013-02-02
  • C# WinForm狀態(tài)欄實時顯示當前時間(窗體狀態(tài)欄StatusStrip示例)

    C# WinForm狀態(tài)欄實時顯示當前時間(窗體狀態(tài)欄StatusStrip示例)

    這篇文章主要介紹了C# WinForm狀態(tài)欄實時顯示當前時間(窗體狀態(tài)欄StatusStrip示例),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • AnyChat的視頻會議程序實例詳解

    AnyChat的視頻會議程序實例詳解

    AnyChat是一款跨平臺的音視頻解決方案。通過本篇文章給大家介紹AnyChat的視頻會議程序,涉及到anychat相關知識,對anychat視頻會議相關知識感興趣的朋友一起學習吧
    2016-01-01

最新評論