WinUI 3 Preivew1のプロジェクトをPreview2に更新する

WinUI 3 Preview 2 気づかずに半月程たってしまいましたが、WinUI 3のPreview2がでてました。 WinUI 3 Preview 2 (2020 年 7 月) なので、以前WinUI 3 Preview1を使って作成した以下のWinUI3 DesktopプロジェクトをPreview 2に更新してみました。 今回はその記録です。 基本的に公式の説明通り進めていっただけなので有用な情報は少ないです。 環境の更新 公式ページの記述に従い環境を確認していきます。 開発用コンピューターに Windows 10 バージョン 1803 (ビルド 17134) 以降がインストールされていること Windows10 2004なのでOK. Visual Studio 2019 バージョン 16.7 Preview 3 のインストール インストール済みのVS2019 Previewのバージョンを確認してみると、16.7.0 Preview 3.1でした。 なのでこのままいくことに。 更新プログラムの確認をしたところ、16.8.0 Preview 1.0がありましたが、前回.NET 5のバージョンを最新にしたことでWinUI 3 Preview1の起動が失敗するようになったのでむやみに最新にするのはやめました。 .NET 5 Preview 5 WinUI3 Preview2では.NET 5のPreview5に対応したみたいです。 現状の最新を確認したところ、Preview7がありましたが確実に動作させるためにPreview5にしておきます。 ただし、今回は公式ページの説明に「Preview5よりも新しいのを入れないで」という但し書きが無かった(前回はあった)のでひょっとしたらPreview7でも動くかもしれません。 WinUI 3 Preview 2 VSIX パッケージのインストール VSへの拡張機能をいれます。 ただダウンロードしてインストールしてみたところ、既に入っていますと表示されていたのでPreview1から変わってないと思います。 ...

2020-08-07 · 1 分 · 120 文字 · ayumax

.NET Coreでアセンブリをアンロードする

アセンブリをアンロードする仕組み この記事は C# Advent Calendar 2019 の10日目です。 私がお仕事で作っているアプリケーション(.NET Framework製)にユーザープラグイン(DLL)読み込み機能を持つものがあります。 これは利用者がルールに則ったDLLを自分で作ることで、開発ツールに機能を足すことのできる機能です。 この機能は開発ツール側でいったん該当のDLL達をロードし問い合わせを行い、読み込む必要のないDLLはアンロードする処理が入っています。 この開発ツールを.NET Coreに移植する際に.NET Frameworkとは異なる手法を使う必要があったので紹介します。 AppDomainは使えない .NET Frameworkではアセンブリのアンロードを行うにはAppDomainを使いました。 アプリケーション規定のAppDomainの他にドメインを生成し、その中でアセンブリをロードします。 インターフェイスなどを経由してアセンブリの機能を利用し終わったら、AppDomainのUnloadメソッドをコールしてドメインごとアセンブリをアンロードします。 ただし.NET CoreではAppDomainは1つしかサポートされていないため、この方法は使えません。 その代わり.NET Coreではアセンブリのアンロードを行うために AssemblyLoadContextが用意されているので、今回はこれを使ってみます。 AssemblyLoadContextとは AssemblyLoadContextとはAppDomainと同様にアセンブリ読み込みを閉じたスコープ内で行えるものです。 この中にロードしたアセンブリは、AssemblyLoadContextのUnloadメソッドをコールすることでまとめてアンロードできますが注意することがあります。 注意点1 isCollectibleをtrueにする AssemblyLoadContextのコンストラクタ引数にあるisCollectibleはtrueにする必要があります。 これはパフォーマンスの観点からデフォルトではfalseになっているためです。 falseのままUnloadをコールすると例外が発生します。 System.InvalidOperationException HResult=0x80131509 Message=Cannot unload non-collectible AssemblyLoadContext. Source=System.Private.CoreLib 注意点2 アンロードは強制的ではなく協調的である AssemblyLoadContextのUnloadメソッドはコールされた時点では開始されるだけで、完了していません。 アンロードが完了されるのは、以下の条件を満たしたときです。 コール スタックに、AssemblyLoadContext にロードされたアセンブリ内のメソッドを含むスレッドがなくなった。 AssemblyLoadContext にロードされたアセンブリ内の型、それらの型のインスタンス、およびアセンブリ自体が参照されなくなった。 つまりちゃんと考えて設計をしないと、いつまでたってもアンロードが完了しない事も起こります。 サンプル作成 それでは実際にアセンブリをアンロードする仕組みを実装してみます。 1. ロードされるクラスライブラリを作成 なんでもよいのですが、以下のような簡単なクラスを定義しました。 TargetFrameworkにはnetstandard2.1を指定しています。 これはClassLibrary1.dllという名前で出力されるようにしておきます。 namespace ClassLibrary1 { public class Class1 { public void Hello(int arg) { Console.WriteLine(arg); } } } 2. ロードする側にAssemblyLoadContextを実装 まずはアセンブリを読み込むためのAssemblyLoadContext を作成します。 今回作成したのは以下のような簡単なクラスです。 ...

2019-12-10 · 2 分 · 369 文字 · ayumax

UE4のスクリプトをC#で書きたい(実験編)

C#でスクリプトを書きたい 私はUE4のC++は好きです。マーケットプレイスにもいくつかC++プラグインを出してます。ですがC#もたくさん書いているので、時々C#だったらもっと楽に書けるのになあと思うことはあります。 そんな事を考えていて、ふと次のような書き込みをTwitterでしました。 {{< x user=“ayuma_x” id=“1165145950710484993” >}} すると@kekyo2さんからこんなお誘いがあり、今日実際に1日かけてトライしてきました。 IL2C 今回の主役となるツールは@kekyo2さんの作成されているIL2Cです。 IL2Cを用いるとC#をコンパイルしたILを含むDLLやEXEからC言語のソースコードが生成できます。( 凄い) これを使ってC#のコードをUE4のC++から呼んでみようというのが今日行った実験です。 開発環境 今回行った実験は以下の環境でおこなっています。 Visual Studio 2019 Unreal Engine4 Ver. 4.22 また、以下に今回行った手順を書いていきますが色々試行錯誤した結果のため、手順を見ただけでは何故それをやるのかわからない箇所もあるかと思います。 今回の試みはまだ実験段階のためご了承ください。 今回作成したプロジェクト一式は以下に置いてあります。(UE4, C#全部入ってます) C#プロジェクトの作成 まずC#のクラスライブラリのプロジェクトを作成します。今回は.NET Standardのクラスライブラリを選択しました。 次にプロジェクトファイル(*.csproj)のPropertyGroupにというタグを追加しtrueの値を記述します。 この記述は通常.cで出力されるファイルを.cppで出力します。 これはUE4でこの後ビルドを正常に通すために必要な設定です。 &lt;PropertyGroup> &lt;TargetFramework>netcoreapp2.1&lt;/TargetFramework> &lt;IL2CEnableCpp>true&lt;/IL2CEnableCpp> &lt;/PropertyGroup> 次にデフォルトで作成されているClass1.csに以下の記述を行います。 using System; namespace UE4Il2CSample { public class Class1 { public static int Add(int a, int b) => a + b; } } staticなメソッドを1個用意しました。 単純にint型の引数2つを足し算する関数です。 ...

2019-09-15 · 2 分 · 290 文字 · ayumax

.NET Core 3.0 WPFを試す(ノードベース電卓をつくってみた)

試してみた Visual Studio2019 + .NET Core 3.0の組み合わせではWPFが使えるぞということで新規プロジェクトを作成して試してみました。 とりあえず.NET Coreを使っているということを忘れて今までのWPFを使っている気持ちで書いてみて、どんな感じか見てみようと思います。 利用方法は色んな方が紹介されていますが、Visual Studio2019と.NET Core 3.0をインストールして、Visual Studioのオプションから「プレビューの.NET Core SDKを使用」にチェックをONすると使えるようになります。 .NET Core 3.0が正式版になればこのチェックはいらなくなると思います。 C# 8.0 null許容参照型 同時にC# 8.0で導入されるnull許容参照型も試してみました。 今回は新規プロジェクトを作って試すので、.csprojに以下のように記載をしてプロジェクト全体でnull許容参照型を有効にしています。 <propertygroup></propertygroup> <outputtype></outputtype>WinExe <targetframework></targetframework>netcoreapp3.0 <usewpf></usewpf>true <langversion></langversion>8.0 <nullablecontextoptions></nullablecontextoptions>enable この設定にすることで、今までの参照型の書き方ではnullをいれることができなくなります。 またnullである可能性がある変数にアクセスすると警告を出してくれるようになります。 作ったもの 新規でプロジェクトを作るので、何かテーマを決めようと思い、 仕事で触っているUnreal Engine(UE4)や最近注目しているHoudiniというツールでノードベースの作成環境をよく見ているので「ノードベースタイプのUI」をテーマにしました。 ただノードをつなげるだけだと面白くないので、電卓機能をいれています。 作ったものは、この記事を書いた時点で以下のような感じです。 現状ノードをつなげて足し算と引き算ができます。 {{< x user=“ayuma_x” id=“1127130209390477312” >}} プロジェクト一式はGitHubで公開しています。 ※ このノードベース電卓ですが、まだまだ作成中の段階のため頻繁に修正しています。 NuGetからの参照 今回NuGetからは以下の4つを参照に加えています。 Extended.Wpf.Toolkit gong-wpf-dragdrop Microsoft.Xaml.Behaviors.Wpf ReactiveProperty この中で、Extended.Wpf.ToolkitとMicrosoft.Xaml.Behaviors.Wpfは.NET Core 3.0にまだ対応していないようで以下の警告がでました。 NU1701: パッケージ &#39;Extended.Wpf.Toolkit 3.5.0&#39; はプロジェクトのターゲット フレームワーク &#39;.NETCoreApp,Version=v3.0&#39; ではなく &#39;.NETFramework,Version=v4.6.1&#39; を使用して復元されました。このパッケージは、使用しているプロジェクトとの完全な互換性がない可能性があります。 NU1701: パッケージ &#39;Microsoft.Xaml.Behaviors.Wpf 1.0.1&#39; はプロジェクトのターゲット フレームワーク &#39;.NETCoreApp,Version=v3.0&#39; ではなく &#39;.NETFramework,Version=v4.6.1&#39; を使用して復元されました。このパッケージは、使用しているプロジェクトとの完全な互換性がない可能性があります。 とりあえず使っている範囲での動作には問題がないのと、.NET Core 3.0はまだプレビュー版なので気にしない事にしています。 ...

2019-05-13 · 2 分 · 246 文字 · ayumax

Center CLR Try!開発 #2に参加した

Center CLR Try!開発 #2に参加 先日行われた「Center CLR Try!開発 #2」に参加してきました。 場所は#1とは違う場所で金山駅の目の前でアクセスしやすかったです。 ただし目指すビルが工事中で入り口が見つけづらく数分迷いました。。。(方向音痴なので最初違うビルに行ってしまった) 当日の参加者は3名(MatsuiさんとMatsuokaさんと私)とすごい方お二人とご一緒で少し、いやかなり緊張しましたが、人数が少ないおかげで色々とお話もでき有意義な1日でした。 自分のやったこと この日はもともと1日Unityで開発中のアプリ制作をやる予定でしたので、それをやりました。 自分の会社の部署の忘年会で使うための景品抽選アプリを作っています。 今までゲーム開発ツールはUnreal Engineをずっと使っていますが、Unityは未経験だったためUnityで今月始めからTryしてみました。 (* Unreal Engineはものすごーく使ってますが、ゲームは作ったことはありません) ちなみに自分で設定した納期は11月末なので、期間は1ヶ月です。 もうちょっと詳細 UnityのUI機能(UnrealでいうところのUMG)を使って、忘年会参加者登録画面を作っていて、そこにスマホのカメラで撮った写真を登録する機能を作っていました。 カメラ撮影はOS依存のAPI使わなきゃいけなかったらイヤだなあと思っていたのですが、Unityの機能だけであっさりと実現可能! (事前にアプリにカメラ使用のための許可確認をやってます) // 実行デバイスに付属のカメラ(最初に複数ある場合は1個め)を取得 var cameraDevice = WebCamTexture.devices[0]; // カメラ映像を投影するテクスチャを作成 cameraTexture = new WebCamTexture(cameraDevice .name, 1280, 720); // 撮影スタート cameraTexture.Play(); // カメラ映像をUIに表示(taregetImageはUI上のRawImageの参照) taregetImage.texture = cameraTexture; 上のコードを実行すると、UI上のRawImageにカメラ映像がリアルタイムで表示されます。 多分カメラ映像を毎フレームRawImageのテクスチャに転送してくれているのだと思います。 今回は静止画を保存したいので、UIのボタンが押されたタイミングで以下のコードを実行して画像データを保存しました。 // その時点でのカメラ画像のピクセルバッファを取得 Color32[] color32 = cameraTexture.GetPixels32(); // カメラ画像を表示するためのテクスチャを作成 var cameraImage = new Texture2D(cameraTexture.width, cameraTexture.height); // テクスチャにピクセルバッファをコピー cameraImage .SetPixels32(color32); cameraImage .Apply(); // カメラの撮影を止める cameraTexture.Stop(); これでcameraImageにカメラで撮影された画像がテクスチャとして入っているので、これをUIのRawImageに差し込むことで目的の機能が実現できました。 ...

2018-11-12 · 1 分 · 79 文字 · ayumax

CenterCLR勉強会でLTしてきた

勉強会参加 8/11にCenterCLRの勉強会に参加してきました LTに申し込み 今回は最初は通常枠で申し込んでいたのだけど、ある日ふと確認したらLT枠が空いていたので申し込み。 この時点ではまだ何を話そうか決めてなかったけど、とりあえず題材決めと当日の資料作りを開始した。(ここの時点で2週間前くらい) 勉強会当日 スポンサーセッションがあった後、登壇者のセッションが開始されました。 植田さんのHoloLensを使った授業の紹介は、凄く楽しみにしていて、すごいなあと思ったし一番感じたのが、自分が中高生の頃にこういったモノがあったらよかったなーと思いました。 松井さんのお話も、今自分が始めてみようと思っていた者に関してだったので興味深く聞いてました。 自分の番 勉強会の間に1回休憩を挟んで、休憩後がLTの時間でした。 ちょっと直前になって緊張が高まり過ぎてしまい、休憩時間にHoloLens見せていただこうと思っていたけど無理でした。。。 はじめてのLTということで、事前に練習したとおりやって5分という時間も守ることができました。 ただ緊張しすぎてて、喋りはじめのころカミカミでやばいって思ったのと、デモやったときに、手が震えてマウスがうまく使えなくてちょっと焦りました。 あとはずっとディスプレイみたまま喋ってしまったので、もう少し余裕が自分にできたら、聞いていただける方を見て喋れるようにしないかんなと思いました。 今日喋らせてもらったスライドはこちら Markdownでパワポ資料を作る from AyumaKaminosono www.slideshare.net 懇親会 勉強会終了後の懇親会に参加させてもらって、いろんな話をお聞きできました。 自分には理解できないハイレベルな話もありましたが、楽しい1日になりました。

2018-08-13 · 1 分 · 23 文字 · ayumax

C#でOpenXML SDKを使ってPowerPointファイル(*.pptx)の出力を行う

はじめに この記事はC#でMarkdownをパースしてオリジナルの出力を行う(markdigを使用)の続編です。 上記記事の中で書いたMarkdownを PPTXにするツールはOpenXML SDKを使用してPPTXファイルを作成しています。 このOpenXML SDKの使い方が最初すごい苦労したのでその部分について今回の記事は書くことにしました。 なお作成したMarkdownをPPTXに変換するツールはGithubにあげてあります。 OpenXMLとは Office2007から使われだしたファイルフォーマットでXMLファイルをzipで固めたものです。 そのためファイルの拡張子を.zipに変更してから解凍すると、中に入っているXMLファイルを見ることができます。 以前のバイナリ形式とは違いOfficeがインストールされていない環境でも作成することができます。 作成する環境 以下の感じです Windows10 Visual Studio 2017 C# .Net Standard 2.0 Class library OpenXML SDKについて OpenXMLの記載方法は以下の公式サイトを参考にしました https://docs.microsoft.com/en-us/office/open-xml/open-xml-sdk ただ上記サイトの説明のみでは理解するのにかなり時間がかかると思われるので、もしこれからOpenXML SDKを使うかたには以下の方法をお勧めします。 Open XML SDK Productivity Tool https://www.microsoft.com/en-us/download/details.aspx?id=30425 このツールを使用すると、指定したOpenXML形式のファイル(xlsxとかpptx)の中身の構造を確認することができます。 またツールを作るのに役立つのが、画面右側の領域に読み込んだファイルを作成するのに必要なC#のコードが出る機能です。 なので、自分の実装したい内容のファイルを作成し読み込んでC#のコードを確認していくと、100%理解しなくても動くものができる可能性がグッと近くなります。 私はこれを使ってちょっとずつ差分を見ながら欲しいコードを見つけてました。 例)フォントの太字をどうすればよいかを知りたいとき 新規作成したpptxのファイルにテキストを1つのみ配置して、C#コードを確認 上記pptxファイルをコピーして、テキスト部分をBoldにしてC#コードを確認 1.と2.を見比べる PowerPointのOpenXMLクラス構成 解説 基本的に上記に説明したOpen XML SDK Productivity Toolを使った方法を使えば、自分の欲しい機能は作れてしまうので話は終わるのですが、自分の備忘録を兼ねて調べたクラス構成を以下に書きます。 OpenXMLファイルのクラス構成はかなり数が多いため、重要な部分に絞って記載してます。 全体 まずは全体構成です。 PPTXを作成するには、図の下端にあるSlidePart, SlieMasterPartを一番触ることになります。 スライド全体の設定(スライドサイズなど)はSlideMasterPart, 各スライドについてはSlidePartといった分担です。 ThemePartは見た目のデザインを変更するに際にいじることがあり、また図には載せていませんが、スライドレイアウトを使う場合はSlideLayoutも触ることになります。 (今回私の作成した機能は1枚目のタイトルシート以外は全てBlankスタイルのシートを使っているので、スライドレイアウトについては触れていません) Slie 次はスライドです。PowerPointの1枚のスライドに相当するためSlidePartクラスのインスタンスはページ数とイコールになります。 上記図は以下の機能を実装する際に重要になってくるクラスのみを抜き出しています。 テキストボックスの配置 イメージの挿入 表の挿入 基本的にスライド内に張り付けるオブジェクトは全てShapeTree配下にぶら下がるようです。 一番多用するテキストボックスは、この図の中ではShapeTree以下のShapeに該当します。 Pictureがイメージになり、GraphicFrameが表です。 ...

2018-08-08 · 1 分 · 121 文字 · ayumax

C#でMarkdownをパースしてオリジナルの出力を行う(markdigを使用)

はじめに 今回MarkdownをPowerPoint形式のファイル(*.pptx)に変換するツールを作成しました。 その中での技術的なメモをまとめておきます。 今回記述するのはMarkdownのパースについてです。 作成したツールはGithubにあげてあります。 https://github.com/ayumax/MDToPPTX また上記pptxを作成するツールの記事はこちらの記事を参照ください。 作成する環境 将来的にXamarinを使ったツールに組み込むことを考えていたため、.Net Standard 2.0のC#ライブラリとしてプロジェクトを作成しました。 全体としては以下の環境で作ってます Windows10 Visual Studio 2017 C# .Net Standard 2.0 Class library どうやってMarkdownをパースするか 最初は自前で正規表現か何かを使ってパースする事を考えていましたが、Markdownの書式は意外に数が多いので何か便利なライブラリがないか探したところ以下のものを見つけました。 markdig こちらのライブラリはGithubでBSD-Clause 2 licenseで公開されており、Nugetから取得できます。 Markdownをhtmlに変換するだけなら、そのままの利用でできますしhtml以外へも出力部分を自分で作成すれば可能な作りになってます。 markdigの通常の使用方法 Markdownをhtmlに変換するには以下の記述のみで可能です(githubのREADME.mdから抜粋) var result = Markdown.ToHtml("This is a text with some *emphasis*"); Console.WriteLine(result); // prints: &lt;p>This is a text with some &lt;em>emphasis&lt;/em>&lt;/p> parserとしてのmarkdigの利用 今回私のやりたかった事はMarkdownをパースして、PowerPointファイルを出力することですのでmarkdigのパーサーとしての機能のみ利用し、オリジナルの出力ができないか調査しました。 markdigの処理の仕組み markdigを利用して独自の出力を行う場合にどのようにしれば良いかを調べるためプリセットされているHtmlRendererがどのように実装されているかを簡単に表したのが以下の図。 HtmlRendererの継承元をたどるとRendererBaseに行き着き、そこには変換時に使用するRender()メソッドと、Markdownのブロックとインラインを処理するためのObjectRenderersプロパティが定義してある。 Renderer 出力したいファイル別にRendererクラスを定義するようになっていて、デフォルト実装内ではHTMLファイルを出力するHtmlRendererと、正規化されたMarkdownテキストを出力するNormalizeRendererが実装してある。 上記クラス図の中間にあるTextRendererBaseはテキストファイルに出力するRendererの機能をまとめてあるクラス。 ObjectRenderers パースされたMarkdownオブジェクトをどのような形式で出力するか定義する部分。 HtmlRendererのコンストラクタでは以下のように実装されている。 // Default block renderers ObjectRenderers.Add(new CodeBlockRenderer()); ObjectRenderers.Add(new ListRenderer()); ObjectRenderers.Add(new HeadingRenderer()); ObjectRenderers.Add(new HtmlBlockRenderer()); ObjectRenderers.Add(new ParagraphRenderer()); ObjectRenderers.Add(new QuoteBlockRenderer()); ObjectRenderers.Add(new ThematicBreakRenderer()); // Default inline renderers ObjectRenderers.Add(new AutolinkInlineRenderer()); ObjectRenderers.Add(new CodeInlineRenderer()); ObjectRenderers.Add(new DelimiterInlineRenderer()); ObjectRenderers.Add(new EmphasisInlineRenderer()); ObjectRenderers.Add(new LineBreakInlineRenderer()); ObjectRenderers.Add(new HtmlInlineRenderer()); ObjectRenderers.Add(new HtmlEntityInlineRenderer()); ObjectRenderers.Add(new LinkInlineRenderer()); ObjectRenderers.Add(new LiteralInlineRenderer()); 前半の定義ではブロック単位の出力を定義するオブジェクトが追加されており、後半の定義ではブロック内のインライン部分の出力定義がされたオブジェクトが追加されている。 パースされたMarkdownBlockオブジェクトには内部にさらにInlineオブジェクトが配置されているためRendererをBlockとInlineに分けることで処理の実装が書きやすくなっている。 ...

2018-08-07 · 2 分 · 272 文字 · ayumax

MarkdownをPowerPointファイルに変換するツールを作成した

MDToPPTX 先日から作成していたMarkdownファイルをPowerPointファイル(*.pptx)に変換するツールMDToPPTXのベータ版ができました。 使用言語はC#で、ライブラリ部分は.net standard2.0で作ってます。 なので試してないけど、.net coreやXamarinでも動くはず。 これを使用するとMarkdownでパワポのファイルを作成できます。 markdig Markdownの解析にはmarkdigを利用しました。 これのおかげでとっても楽に書けてます。 openxml パワポファイルの作成はopenxmlを利用してます。 これを使う事でパワポがインストールされてないマシンでもpptxファイルの作成が可能です。 ただsdkを使っても利用難易度は高かったです。 実行exe github内のプロジェクト内のMarkPP.exeは以下のようなコマンドで使用可能です。 MarkPP.exe "markdownfle path" "title" "subtitle" マークダウンファイルパスの(.md)を(.pptx)に変換してファイルが出力されます。 以下はgithubのREADMEにも記述してありますが、 対応構文 以下の構文に対応してます。 Markdown内でのHTML表記には対応してません。 HEADERS(Level1 or Level2に対応、パワポにLevel3以降はいらんだろ) BLOCKQUOTES LISTS CODE BLOCKS(インラインコードもOK) LINKS EMPHASIS(Bold, Italic, Strike) Images(1pixel -> 1mmで配置) Table シートの境目は—を記述します。 記述例 input Markdown例 コードブロックの中にバッククオート3つが書けないので、‘‘‘で置き換えてます # テストシート1 テストシートです。 **太字**です *イタリック*も対応 ~~打消しも可能~~ [ハイパーリンク例](http://ayumax.hatenablog.com/) ↓コードブロック ‘‘‘ class ClassA { public ClassA() { } public void Func() { } } ‘‘‘ --- # テストシート2 テストシート2枚目です 箇条書きにも対応 + 箇条書きです + インラインコードも`対応`してます イメージの挿入もできます ![image1](ayumax.jpg) 引用文はこちら > 引用サンプル > です --- # テストシート3 ## サブタイトル テストシート3枚目です 1. 数値の箇条書き 1. 数値の箇条書き2行目 1. 数値の箇条書き3行目 表も書けます | Left align | Right align | Center align | |:-----------|------------:|:------------:| | 1行目左 | 1行目 | 1行目右 | | 2行目左 | 2行目 | 2行目右 | | 3行目左 | 3行目 | 3行目右 | output PPTX こんな感じで出力されます。 ...

2018-06-06 · 1 分 · 142 文字 · ayumax

PPTX作成機能 イメージ挿入と箇条書き

前回版の課題 前回の記事(http://ayumax.hatenablog.com/entry/2018/05/06/231645)の段階では以下の課題がありました。 テキストの位置を自由に変更できない イメージ挿入機能がない テキストが全て箇条書きになる そこで今回はそれらの対策を行いました。 テキストの位置設定 PPTXTextAreaクラスを新規作成し、Position(x,y)とSize(width, height)を設定できるようにした。 パワポの世界ではcmで設定するようなのでcmで値は入れれるように行った。(内部で変換している) イメージの挿入 これまたPPTXImageクラスを新規作成して対応。 PPTXTextAreaと同様に位置も指定できるようにした。 ただ課題があって、もと画像のアスペクト比を保ったまま拡縮ができない。。やろうと思うとSizeの値をアスペクト比を保った値に自分でいれてあげる必要があり、ちょっと不便。 テキストの箇条書き設定 PPTXBulletを新規作成。enumでテキストの箇条書き設定を設定可能。 結果 入力ソース using (PPTXDocument document = new PPTXDocument(PPTXFilePath, settings)) { document.Slides = new List<PPTXSlide>() { new PPTXSlide() { SlideLayout = settings.SlideLayouts[EPPTXSlideLayoutType.TitleAndContents], Title = new PPTXTextArea("コンテンツ1ページ目"), TextAreas = new List<PPTXTextArea>() { new PPTXTextArea("本文です。\n\\nをいれると改行もされます") } }, new PPTXSlide() { SlideLayout = settings.SlideLayouts[EPPTXSlideLayoutType.TitleOnly], Title = new PPTXTextArea("コンテンツ2ページ目"), TextAreas = new List<PPTXTextArea>() { new PPTXTextArea("パワーポイント2枚目のテキスト1", 1, 5, 20, 2), new PPTXTextArea(1, 7, 20, 7) { Texts = new List<PPTXText>() { new PPTXText("2枚目1行目", PPTXBullet.Circle), new PPTXText("2枚目2行目", PPTXBullet.Circle), new PPTXText("2枚目3行目", PPTXBullet.Rectangle), new PPTXText("2枚目4行目 箇条書き解除") } } }, Images = new List<PPTXImage>() { new PPTXImage(@"C:\temp\sample.jpg", 1, 15, 5, 3), new PPTXImage(@"C:\temp\sample.jpg", 7, 15, 5, 3) } } }; } 結果 次 これでpptx作成機能はひと段落。 フォントの設定機能もあった方が良いかなあとも思うけど、あまり凝りすぎると先に進まないので必要最低限で。 またいるなって思ったら検討する予定。 ...

2018-05-13 · 1 分 · 124 文字 · ayumax