20191126のC#に関する記事は8件です。

【C#】[,]と[][]って違う配列だった。そしてLINQ

最近ASPを初めたC#初心者です。

ジャグ配列を多次元配列だと勘違いしていたため備忘録を兼ねて記事を書きました。

公式ドキュメント

とりあえず公式ドキュメントだ、という人のためにのリンクと簡単な説明の引用です。
ジャグ配列

ジャグ配列とは、その要素も配列である配列です。 ジャグ配列の要素には、異なるディメンションとサイズを指定できます。 ジャグ配列は、"配列の配列" と呼ばれることがあります。 次の例では、ジャグ配列の宣言、初期化、およびアクセスの方法について説明します。

多次元配列

配列は 1 つ以上の配列を持つことができます。 たとえば、次の宣言は、4 行と 2 列の 2 次元の配列を作成します。

なぜ勘違いが生まれたのか

多次元配列とイメージして最初に浮かんだ書き方がこうでした。

int[][] array;

これで構文エラーが出なかったので、これであってたーと思ってしまったのが原因です。

その後、以下の値が入ることに気づきました。
[[1],[2, 3]]

これ多次元配列違う…
その後、ジャグ配列と多次元配列があることに気づきました。

多次元配列は次のように書きます。

int[,] array;

[,]と[][]って違う配列だった(タイトル回収)

はじめて学んだ言語がJavaというのもあって、まだJavaの書き方が頭の中に残っていたそうです。(もうJava数年触ってないけど)

多次元配列だとLINQが使えなかった

ここまでジャグ配列でコード書いてところを多次元配列に変えたことで構文エラーが出ることに気づきました。

int[][] array = new int[][] { new int[] { 1 }, new int[] { 2, 3 } };
array.Select(x => x); // ジャグ配列 → OK

int[,] array = new int[,] { { 0, 1 }, { 2, 3 } };
array.Select(x => x); // 多次元配列 → Error

上記の公式ドキュメントを読んで、配列の作りがそもそも違うことを知ったので、そりゃ違うかーと軽く考えていたのですがそもそも多次元配列だとLINQが使えないことに気づきました。(こいつ何度も気づかされてんな)

多次元配列でLINQ使えない説明が公式ドキュメントに書いてあった気がするのですが今見返しても見つからなかった…

LINQ使うなら次のようにすればいいでしょうか?(※実際には書いてない)

int[,] array = new int[,] { { 0, 1 }, { 2, 3 } };
var castArray = array.Cast<int>(); // [0, 1, 2, 3]

ということで、ジャグ配列と多次元配列の違いでした。

あとがき

C#むずかしい

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】Airtableを使って簡易的なDB管理をする方法【SQLは不要】

こんにちは!
ねこじょーかー(@nekojoker1234)と申します。

Unityでゲームを作ろうとしたときに、DBとしてデータを管理して、そこからデータを引っ張ってくる、といった処理も必要になってくると思います。

数個くらいのデータであれば「まぁ、if文で分岐すればいいか」となりますが、さすがに数十、数百となると手間が増えてやっていられないですよね。

しかし、ちゃんとしたDBを用意するとなると、サーバー・テーブル設計・SQLなどなど、考えることがたくさんあります。

そんな「大規模なDBはいらないけど、ソースコードにベタ書きも嫌だ!」という人のための記事です。

Airtableを使って簡易的なDB管理をする方法

Airtableに登録する

タイトルでネタバレしていますが、まずはAirtableに無料登録しましょう。

Airtable」は、スプレッドシートのような機能が無料で使えるサービスがあり、これをDB代わりに使用することができます。

登録手順はメールアドレスを登録するだけなので割愛しますね。
登録が終わったら、以下の画面が表示されます。

スクリーンショット 2019-11-26 21.18.18.png

テーブルを追加する

先ほどの画像で「Add a base」となっているところをクリックすると、新しいテーブルを作成することができます。

「Start From Scratch」を選択することで、完全に「空」のテーブルになります。

スクリーンショット 2019-11-26 21.23.37.png

レコードを追加する

基本的な使い方はExcelと同じなので、特に操作の説明はしません。

私は以下のようなテーブルを作成しました。

スクリーンショット 2019-11-26 21.26.58.png

一番上に表示されているのが「テーブル名」、左上に表示されているのが「シート名」です。

シート名はプログラム上で使うことになるので、コピーしておいてください。

APIキーを確認する

トップページ右上の「Account」からマイページに行くと、APIキーが「●●●●●●」と表示されているので、カーソルを合わせると具体的なAPIキーが表示されます。

このAPIキーはプログラムで使用するのでコピーしておきましょう。

BaseIDを確認する

まずは以下のページにアクセスしてください。
https://airtable.com/api

「The ID of this base is」となっているところがBaseIDなので、これをコピーしておきましょう。(灰色でぬりつぶしているところです)

スクリーンショット 2019-11-26 21.36.26.png

これでようやくAirtable側の準備が終わったので、次からはUnity側の準備に入ります。

AirtableClientをプロジェクトにインポート

以下で公開されているソースコードを、プロジェクトにインポートしましょう。
csファイルだけで大丈夫です。

https://github.com/yKimisaki/AirtableClient

Utf8Jsonをプロジェクトにインポート

AirtableClientをインポートすると、「Utf8Jsonがないよ!」と怒られるので、Utf8Jsonもインポートしておきます。

https://github.com/neuecc/Utf8Json

するとここで、「unsafeが許可されていません」的なエラーが出て困ることになるので、unityの設定を変更しましょう。

「Edit -> Project Setting」と進んでいき、「unsafe」と検索窓に入力して「Allow 'unsafe' code」を見つけます。

スクリーンショット 2019-11-26 21.48.28.png

このチェックをつけることで、エラーを解消することができます。

処理を実装する

では、実際の処理を実装していきましょう。

サンプルはこんな感じです。

var client = new AirtableClient("コピーしたAPIキー");
var @base = client.GetBase("コピーしたBaseID");
var allRows = @base.LoadTableAsync<"コピーしたシート名">().Result;

foreach (var row in allRows)
{
    // 1レコードずつ取り出す処理 
}

コピーしたシート名の型のエンティティが返ってくるので、シート名をクラス名にして、各列名をプロパティ名にします。

public class CharacterParam
{
    public string Name;
    public int Attack;
    public int Defence;
    public int HitPoint;
}

完成

めでたく完成です!

「応答なし」で固まってしまう場合は、以下のケースが考えられるので、チェックしてみてください!

  • APIキーが間違っている
  • BaseIDが間違っている
  • シート名とエンティティ名が一致していない
  • オフラインになっている

補足

最後に念のため、公式で提供されているAPIとドキュメントをリンクとして貼っておきます。

公式API
https://github.com/ngocnicholas/airtable.net

公式ドキュメント
https://github.com/ngocnicholas/airtable.net/wiki/Documentation

あわせて読みたい

筆者のブログ:https://nekojokerblog.com

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ASP.NET Core3.0 RazorPages事始め(11)番外編 - _Layout.cshtml/_ViewImports.cshtml/ViewStart.cshtml

はじめに

これまで、10回にわたって公式ページのチュートリアルをやってきたわけですが、ちょっと書き足りない部分があるので、番外編ということで、あと数回、ASP.NET Core Razor Pages について書いていこうとと思います。

さて、今回は、dotnet new webapp コマンドで自動で作成される、以下のファイルについて、見ていこうと思います。

  • /Pages/Shared/_Layout.cshtml
  • /Pages/_ViewImports.cshtml
  • /Pages/_ViewStart.cshtm

以前の記事とすこし被るところがありますが、ご容赦を。

/Pages/Shared/_Layout.cshtml

このファイルは、アプリケーションで利用するhtmlのテンプレートが定義されています。

一部を抜粋して示します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - Movie</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        ...
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - RazorPagesMovie - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

あっ、htmlタグの lang属性は、'ja' に変更しています。

ここで、注目するのは、3点ですね。

ViewDataディクショナリ

一点目は、この記述。

    <title>@ViewData["Title"] - Movie</title>

@マークで始まるのが、ASP.NET Coreの Razor構文です。
ViewDate ディクショナリの "Title"キーに対応する値をtitle要素に設定してます。

例えば、create.cshtmlの先頭には、次のような記述があります。

@{
    ViewData["Title"] = "Create";
}

ですから、

    <title>Create - Movie</title>

と展開され、ブラウザのタブには "Create - Movie" が表示されることのなります。

@Render.Body()

二点目は、

@RenderBody()

です。この部分に、各ページ(index.cshtmlやCreate.cshtmlなど)で記述した内容が挿入されレンダリングされることになります。

そういえば、ViewBagプロパティはないんですね。ViewDataよりもViewBagのほうが好きだったんですけどね。

@RenderSection()

3点目は、最後のほうにあるこの行。

    @RenderSection("Scripts", required: false)

これは、各ページで記述された以下のような部分をレンダリングすることになります。

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

body要素の最後で、javascriptを読み込みたい時に利用します。

この例では、_ValidationScriptsPartial.cshtml ファイルを読み込んでいます。このファイルには次のような記述があるので、クライアント側検証で必要となるavaScriptファイルが読み込まれます。

<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

その他

そのほか、asp-area asp-page といった見慣れない属性がありますが、これはまた別の機会に。

そういえば、ネットで調べていたら、次のようなコードがありました。

    <environment include="Development">
        <link rel="stylesheet" href="~/css/bootstrap.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="~/css/bootstrap.min.css" />
    </environment>

環境変数の値によって、読み込むCSSを切り替えています。ASP.NET Core 2.0 の時は、このようなコードを自動生成していたようです。JavaScriptの読み込みも同様です。

まあ、開発時に、minification していない bootstrap.cssjquery.js が必要かと言われれば、普通の開発者には不要なので、ASP.NET Core3.0で変更したのでしょうね。

/Pages/_ViewImports.cshtml

_ViewImports.cshtmlの内容は以下の通りです。

@using RazorPagesMovie
@namespace RazorPagesMovie.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

各ページのcshtmlをレンダリングする時に、この cshtmlがインポートされるようです。
ここで、@usingディレクティブで RazorPagesMovie名前空間を指定しているので、個別のcshtmlでは、いちいち名前空間を指定しなくて、クラス名などが使えるようになります。

@namespace ディレクティブは、それぞれのページの名前空間を指定してるようです。正確な意味がまだわかってません。

最後の行の

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

では、cshtmlで利用するタグヘルパーというものを提供するアセンブリを指定しています。
もし、自分でタグヘルパーをベルアセンブリとして作ったら、ここにそのアセンブリを追加すれば使えることになります。

/Pages/_ViewStart.cshtml

以下が、_ViewStart.cshtml の内容です。

@{
    Layout = "_Layout";
}

これだけです。

この指定で、_Layout.cshtmlがマスターテンプレートページとして利用されるます。

マスターページを _Layout.cshtml 以外のファイルに変えたかったら、ここを変更すればOKということですね。まあ変えることはないと思いますが。

ちなみに、特定のcshtmlで、別のテンプレートページを使い分けたい場合は、その cshtmlファイルの先頭で、

@{
    Layout = "_myLayout";
}

と書けば、_myLayout.cshtmlが利用されます。

次のように書けば、テンプレート利用されません。この場合は、<!DOCTYPE html> からすべてのhtmlを書くことになります。

@{
    Layout = null";
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity] DEATH STRANDINGのカイラル通信っぽいシェーダ

はじめに

配達系国道制作ゲーム、DEATH STRANDING。このゲームに登場するカイラル通信による通話(広義のホログラムのようなもの)を模倣してみました。
『DEATH STRANDING Day-1 GAMEPLAY SESSION Vol.1』PlayStation® presents LIVE SHOW “TGS2019”の53分あたりに登場。

できたもの

0a1a7f68e69bef5ab94aa7db5956a3af.gif

構成要素

Unity ShaderLabでの実装です。
おおまかな構成要素は以下
1.半透明
2.リムライト
3.vertex shaderでx軸方向にモデルの頂点をランダムに動かす
4.上方向に移動するスキャンライン
5.モデル全体にランダムノイズ
6.モデル全体に青系のオーバーレイ
7.上から下にdissolve
8.1のノイズが大きくなる(dissolve時)

実装

流れとしては、1Pass目で深度書き込み、2Pass目でアウトライン、3Pass目でその他、といった感じです。

1.半透明

Tags { "Queue"="Transparent" }
LOD 100
//先に深度を書き込む
Pass{
  ZWrite ON
  ColorMask 0
}
//透明
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha 

QueueをTransparentに設定し、描画順を不透明オブジェクトの後に設定します。
1Pass目でモデルの深度情報を書き込んでおきます。これをしないとデプス値が正しく更新されず、モデルが綺麗に表示されません。
その後はZWriteをOffにすることで深度の計算を破棄し、Blendを記述することでアルファブレンディングを有効にします。

2.リムライト

2Pass目でモデルの頂点を法線方向にオフセットすることでアウトラインを出します。

v2f vert (appdata v){
  v2f o;
  v.vertex += float4(v.normal * 0.006f, 0);   
  o.vertex = UnityObjectToClipPos(v.vertex); 
  o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
  return o;
}

3Pass目のfragment shaderで視線ベクトルと頂点の法線ベクトルの内積をとることでさらにリムライトっぽくします。

//リムライト
half rim = 1.0-saturate(dot(i.viewDir, i.worldNormal));
fixed4 rimColor = _RimColor * pow (rim, _RimPower);

3.vertex shaderでx軸方向にモデルの頂点をランダムに動かす

3Pass目のvertex shaderで計算を行い、x軸方向またはz軸方向に頂点をランダムに動かします。
ランダムに時間で区切ってオフセットさせるとパッパッと切り替わるような動きになってしまいます。これを防ぐために経過時間をfloorに入れ整数部のみを取り出すことでrandamに入れた時一定時間は同じ値を取るようにし、fracで小数部分のみを取り出しオフセットのサイズ調整に当てています。こうすることでサイズ徐々に変わるウニョウニョした動きをさせることができます。

float offset = Graph(v.vertex.y);
float t = _Time.z*_NoiseSpeed;
float offsetTF = rand(floor(t)+v.vertex.z);
if(offsetTF>_NoiseRange) v.vertex.z += offset*(1-frac(t))*_NoiseSize;

また、ランダムな値の算出は有名な関数をちょっと弄ったもの、Graphは適当にランダムな凹凸が現れるような関数を作成しました。こちらのサイトでグラフを描画して良い感じのものを採用しました。

float rand(float co){
return frac(sin(dot(co,12.9898)) * 43758.5453);
}

float rand2 (fixed2 p) { 
return frac(sin(dot(p, fixed2(12.9898,78.233))) * 43758.5453);
}

float Graph( fixed x){
return pow(_NoiseSize*abs(sin(10*x)*(-sin(x*2)+1))*0.5,2.0)*_Alpha;
}

4.上方向に移動するスキャンライン

ランダムな太さのスキャンラインを上方向に移動させる方法が思いつかなかったので、白黒のシマシマのテクスチャを作成し、uvスクロールさせる方法を取りました。これがスキャンラインA。
上のgifのようなスキャンラインBは、y座標を定数倍して小数部をアルファ値とすることで実装しています。

//スキャンラインA
//float2 scan = i.worldPos + float2 (0, _Time.x*-2.0);
//float4 scanLine = tex2D(_ScanlineTex, scan);

//スキャンラインB
float scanLine = frac(i.worldPos.y*5.0-_Time.y);

5.モデル全体にランダムノイズ

3で使用したノイズ関数を利用します。floorはタイミング調整に便利です。
noiseを減算することでザラついた感じを表現できます。

//ノイズ
float noise = rand2(i.uv+floor(_Time.y*10.0));

6.モデル全体に青系のオーバーレイ

オーバーレイは加算や乗算、スクリーンなどと異なり条件分岐が必要なので少し面倒です。

//オーバーレイ
if (col.r < 0.5){
col.r = 2.0*col.r*_OverlayColor.r;
}else{
col.r = 1.0 - 2.0 * (1.0 - col.r) * (1.0 - _OverlayColor.r);
}

if (col.g < 0.5){
col.g = 2.0*col.g*_OverlayColor.g;
}else{
col.g = 1.0 - 2.0 * (1.0 - col.g) * (1.0 - _OverlayColor.g);
}

if (col.b < 0.5){
col.b = 2.0*col.b*_OverlayColor.b;
}else{
col.b = 1.0 - 2.0 * (1.0 - col.b) * (1.0 - _OverlayColor.b);
}

7.上から下にdissolve

条件付きコンパイルを用いて実装します。
キーワードを定義しておき、

#pragma shader_feature _ Dissolve_ON

定義されたキーワードによってコンパイルする内容を変更します。
バリアントを作成する方がif文で毎回参照するよりも効率が良いので(おそらく)、できるだけこちらをつかいたいです。

#ifdef Dissolve_ON
col.a=saturate(saturate(abs(-i.worldPos.y+_ObjectSize)-_T*_DissolveSpeed)*5.0)*_Alpha;
#else
col.a = _Alpha;
#endif    

dissolveにグラデーションをかけたいので、saturateを使って値を調整します。

8.1のノイズが大きくなる(dissolve時)

実際のムービーを見ていただけると分かるのですが、disolve時はノイズのサイズが大きくなり、密度が大きくなります。C#スクリプトから7のdissolveのキーワード切り替えと同時にノイズのサイズと密度を調整します。

void Dissolve(){
        m.SetFloat("_NoiseSize", 1.5f);
        m.SetFloat("_NoiseRange",0.96f);
        m.EnableKeyword("Dissolve_ON");
        dissolve = true;
}

参考

・半透明 http://nn-hokuson.hatenablog.com/entry/2018/01/23/202530
・オーバーレイ http://sylphylunar.seesaa.net/article/390331341.html
・スキャンライン https://twitter.com/minionsart/status/899628037360234496
・シェーダのバリアント作成 http://light11.hatenadiary.com/entry/2019/01/12/232533

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DataGridViewの縦スクロールの描画パフォーマンスを改善した話

何が書いてあるか?

  • DataGridViewの縦スクロールの描画パフォーマンスを上げた方法
  • 原因の特定方法(大したことではないが)
  • リフレクションで無理やりSetプロパティの制約を回避した話

役に立つのか?

特殊な状況下なので、万人に役にたつかは微妙。
あ、たぶん。役に立たないです。
リフレクション使えば、例外回避して設定できるのかーぐらいかな。
(そもそも、リフレクション使う人は、それぐらい知ってると思うが)

特殊な状況について

DataGridViewを使いスプレッドシートの入出力画面を作成した。
カラムヘッダは独自に直接セル結合を行っていてFixed設定をしている。
※カラムヘッダは非表示(ColumnHeadersVisible = false)
ロウヘッダは行選択をするため残している。(RowHeadersVisible = true)

事象

DataGridViewの縦スクロール時に、上下端からスクロールする場合のスピードが顕著に遅い(カクカクする)

状況調査&原因特定?

DataGridViewはDataSourceを切り替えて使いまわしているが、遅いのは特定の場合で、すべてが遅いわけではない。

データ量の問題かと、表示レイアウトはそのままにDataSourceのみ変更したところ変化が無いことがわかった
⇒ つまり、データ量、DataSouceは関係ない

遅いところと、そうでないところの違いを調べたところ、
RowHeadersVisible の違いがあることがわかり、非表示にしたところパフォーマンスが改善した。

これが問題か?

対応方法について

RowHeadersVisible の設定でのパフォーマンス有無についてネットで調べたが特に有益な情報は得られず。
パフォーマンス改善について、ダブルバッファリングの手法があることがわかった。
以下、対応内容と採用可否である。

  1. RowHeadersの非表示
    時間があれば、独自実装して1カラム目をヘッダーのように扱うことは可能だが、ナイーブな(お察し下さい)実装のため残念ながら採用できない。

  2. ダブルバッファリング
    ネットで多くみかけたのですが、実際に試してみると、
    早くはなるものの、結合セルの部分の再描画が行われる黒くなり使い物にならない。

ここで手詰まりかと思っていたが、天からのひらめき。
RowHeadersVisibleのtrue/falseで、スピードが変わるならColumnHeadersも効果あるのでは?

ということで、第三の方法として

 3. ColumnHeadersの「表示」
本来、非表示であるカラムヘッダを表示してみたところ、パフォーマンスが改善されたのである。

ちょっとの格闘と対応の完全版

結局原因自体は、よくわからんが、カラムヘッダを表示した場合、パフォーマンスが改善された。
ちなみに、検証結果は以下の通り。
ピンポイントの組み合わせで遅かったよ・・・(多くの人は、この事象に出会わないのでは?)

RowHeadersVisible ColumnHeadersVisible 結果
true true OK
true false 遅い
false true OK
false false OK

というわけで、ヘッダの高さをゼロにして非表示扱いにしてみよう。
というのが今回のまとめになる。

dgv.ColumnHeadersHeight = 0; //これは、うまくいかない

ところが、ゼロを実際に設定してみたところ例外が発生した。

MSDN(DataGridView.ColumnHeadersHeight プロパティ)を見ると3以下は設定できないようだ。

じゃあ、リフレクションを使ってみようと試してみるが、プロパティはあってもフィールドが見つからない。(NonPublicを指定しているのに)
プロパティ(PropertyInfo)のSetValueを使ってみると例外が発生する・・・

と、しばらく格闘していたが、わかってみればなんのことはない。
使っているクラスが、CommonFramework.Forms.DataGridViewでなく、それを継承したクラスだったからだ。
なまじpublicのプロパティが見えるので気づくのに時間がかかった。

というわけで、以下のコードで対応。

// dgv は、DataGridView(を継承したクラス)のインスタンス
dgv.GetType().BaseType
   .GetField("columnHeadersHeight", BindingFlags.Instance | BindingFlags.NonPublic)
   .SetValue(dgv, 0);

なるほど。インスタンスからGetTypeするから混乱の元になったのか。
完全に動的に操作する必要ないから以下で大丈夫だった。
※とはいえ、フィールド名 columnHeadersHeight を特定するのが大変だったわけだが。

typeof(DataGridView)
   .GetField("columnHeadersHeight", BindingFlags.Instance | BindingFlags.NonPublic)
   .SetValue(dgv, 0);

.Netのバージョンだったり、そもそも継承の有無で役に立つ可能性は、わからないがメモとして残しておく。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Autodesk Inventor API Hacking (C#8.0、そして.NET Core3.0)

0. はじめに

2019年9月にリリースされた、C# 8.0、そして.NET Core 3.0に移行するには? という話しです。

1. C# 8.0

1.1 C# 8.0 とは、なんぞや

みんなおなじみ、++C++; // 未確認飛行 Cにある、C# 8.0 の新機能が詳しいです。
私のようなライトなユーザーは、

  • null 許容参照型
  • using 変数宣言
  • null 合体代入 (??=)

は使うかもしれないです。

1.2 有効にするには

今までのProjectで有効にするには、.csprojを編集する必要があります。
が、VisualStudioは賢いので、

using int i;

などとcodeに書くと、IntelliSenseが「C#8.0を有効にする?」と聞いてくるので、それに従えば.csprojを編集してくれます。

1.3 .NET Core 3.0は必須じゃないの?

全機能を使おうとすると、.NET Core 3.0もしくは.NET Standard 2.1が必要です。
しかし、機能は限定されますが、.NET Frameworkでも使えます。
詳しくは、C# 8.0 の新機能 : ターゲットフレームワークをご覧ください。

1.4 Nullableをenableにしたいのですが・・・

Project全体でNullableを有効にするには.csprojに指定する必要があります。
しかし、古い形式の.csprojでは、どうしてもIntelliSenseの警告が消えませんでした。(何か勘違いしているっぽい挙動をする)
そこで、Projectを最新形式に書き換える必要がありました。
参考までに、私のProjectを示します。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>net472</TargetFramework>
    <RootNamespace>InvAddIn</RootNamespace>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>

  <PropertyGroup>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="Autodesk.Inventor.Interop">
      <HintPath>..\..\..\..\..\..\Windows\Microsoft.NET\assembly\GAC_MSIL\Autodesk.Inventor.Interop\v4.0_23.0.0.0__d84147f8b4276564\Autodesk.Inventor.Interop.dll</HintPath>
    </Reference>
    <Reference Include="stdole">
      <HintPath>..\..\..\..\..\..\Windows\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll</HintPath>
    </Reference>
    <Reference Include="System.Windows.Forms" />
  </ItemGroup>

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="call &quot;%25vsappiddir%25..\..\Common7\Tools\VsDevCmd.bat&quot;&#xD;&#xA;call mt.exe -manifest &quot;$(ProjectDir)$(TargetName).X.manifest&quot; -outputresource:&quot;$(TargetPath)&quot;;#2&#xD;&#xA;XCopy &quot;$(TargetPath)&quot; &quot;%25AppData%25\Autodesk\ApplicationPlugins\$(TargetName)\&quot; /Y /R&#xD;&#xA;XCopy &quot;$(ProjectDir)Autodesk.$(TargetName).Inventor.addin&quot; &quot;%25AppData%25\Autodesk\ApplicationPlugins\$(TargetName)\&quot; /Y /R   &#xD;&#xA;&#xD;&#xA;if exist &quot;$(TargetDir)ja\$(TargetName).resources.dll&quot; (&#xD;&#xA;&#xA;mkdir &quot;%25AppData%25\Autodesk\ApplicationPlugins\$(TargetName)\ja&quot;&#xD;&#xA;XCopy &quot;$(TargetDir)ja&quot; &quot;%25AppData%25\Autodesk\ApplicationPlugins\$(TargetName)\ja\&quot; /S /Y /R&#xD;&#xA;) else (&#xD;&#xA;echo ***jaリソースが存在しません。&#xD;&#xA;)&#xD;&#xA;" />
  </Target>
</Project>

3. .NET Core 3.0

3.1 .Net Core 3.0 とは、なんぞや?

.NETは幾つかの系列に分裂しています。.NET Frameworkも、その1つの流れです。
分裂していると不便だよね、ということで大統一がなされたのが、.NET Core 3.0です。
.NET Frameworkは現状の4.8をもって最後となるようで、以後は.NET Coreが更新される予定です。

3.2 .NET Core 3.0とAddIn開発

現時点(2019/11/26, Inventor 2020)では、.NET Core 3.0用に作られたAddInは、Inventorで動作しません。
Autodeskがサポートするまで、.NET Frameworkを使い続けるほか在りません。

99. 親の記事に戻る

Autodesk Inventor API Hacking (概略)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】セーブとロード簡単に実装してくれるManagerクラスを作ってみた

UnityのPlayerPrefsが使いづらい…

Unityで使えるPlayerPrefsを使っている方は多いと思います、自分も初めて使った時は感動して多様しました(笑)
ですがPlayerPrefsを使っていくうちに「アレ?なんか使いづらくね?」と気づくわけです。

PlayerPrefs何が使いづらい?

  • まず大量のセーブに向いていない点です。例えば100個の値を保存したい場合100回PlayerPrefsを呼び出す必要性があるわけです。
  • int型、float型、string型しか保存できない。
  • どこに保存してあるかよくわからない。

などなど割と使いづらい点があるわけです。

使いづらいなら作るしかない

使いづらいなら作ればいいじゃない理論でどうせなので作っていきましょう。

欲しい機能

  • 1回のSaveで多数の値を保存できる
  • セーブする時にフォルダ名、ファイル名を指定できる
  • 様々な値を一括で保存できる
    これらの機能を最低限つけて作ります。

コード

SaveLoadManager.cs
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

public static class SaveLoadManager
{
    //ベースとなるフォルダ名
    private const string BASE_FOLDER_NAME="/BaseSaveFolder/";
    //デフォルトのフォルダ名
    private const string DEFAULT_FOLDER_NAME = "SaveFolder";

    /// <summary>
    /// フォルダー名の基づいてファイルをセーブ及びロードする時に使用するパスを決める
    /// </summary>
    /// <param name="folderName">フォルダ名</param>
    /// <returns>パス</returns>
    static string CreateSavePath(string _folderName = DEFAULT_FOLDER_NAME)
    {
        string savePath;

        //使っているプラットフォームを確認(IPhoneかどうか確認)
        if (Application.platform==RuntimePlatform.IPhonePlayer)
        {
            savePath = Application.persistentDataPath + BASE_FOLDER_NAME;
        }
        //それ以外のプラットフォームの場合
        else
        {
            savePath = Application.persistentDataPath + BASE_FOLDER_NAME;
        }

#if UNITY_EDITOR
        savePath = Application.dataPath + BASE_FOLDER_NAME;
#endif

        // セーブパス + SaveManager/
        savePath = savePath + _folderName + "/";

        return savePath;
    }

    /// <summary>
    /// 保存するファイル名を決める
    /// </summary>
    /// <param name="_fileName">ファイル名</param>
    /// <returns>保存されるファイル名</returns>
    static string SaveFileName(string _fileName)
    {
        return _fileName + ".binary";
    }

    /// <summary>
    /// セーブする
    /// </summary>
    /// <param name="_saveObject"></param>
    /// <param name="_fileName">ファイルの名前</param>
    /// <param name="_folderName">フォルダの名前</param>
    public static void Save(object _saveObject,string _fileName,string _folderName=DEFAULT_FOLDER_NAME)
    {
        //セーブパスを決める
        string savePath = CreateSavePath(_folderName);

        //ファイル名を決める
        string saveFileName = SaveFileName(_fileName);

        //ディレクトリがあるか確認、なければ作成
        if (!Directory.Exists(savePath))
        {
            Directory.CreateDirectory(savePath);
        }

        //クラスをバイナリとして扱う
        BinaryFormatter formatter = new BinaryFormatter();

        //ファイル作成
        FileStream saveFile = File.Create(savePath+saveFileName);

        //オブジェクトをシリアル化しディスク上にファイル書き込み
        formatter.Serialize(saveFile,_saveObject);

        //書き込み終了
        saveFile.Close();
    }

    /// <summary>
    /// ロードする
    /// </summary>
    /// <param name="_fileName">ファイルの名前</param>
    /// <param name="_folderName">フォルダの名前</param>
    /// <returns></returns>
    public static object Load(string _fileName,string _folderName=DEFAULT_FOLDER_NAME)
    {
        //セーブパス(指定フォルダ名)を取得
        string savePath = CreateSavePath(_folderName);

        //バイナリファイル名を取得
        string saveFileName = savePath + SaveFileName(_fileName);

        //返すデータ
        object returnObject;

        //Saveディレクトリまたはバイナリファイルが存在しない場合
        if (!Directory.Exists(savePath))
        {
            Debug.LogError("ディレクトリが見つかりませんでした");
            return null;
        }
        if (!File.Exists(saveFileName))
        {
            Debug.LogError("ファイルが見つかりませんでした");
            return null;
        }

        BinaryFormatter formatter = new BinaryFormatter();

        //ファイル開く
        FileStream saveFile = File.Open(saveFileName,FileMode.Open,FileAccess.Read,FileShare.Read);

        //バイナリファイルをデシリアル化しオブジェクトに変換する
        returnObject = formatter.Deserialize(saveFile);

        saveFile.Close();

        return returnObject;
    }
}

これでSaveとLoadをどこでもできるようになりました。

使ってみよう

test.cs
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;

public class test :MonoBehaviour
{
    //外部からいじれるように
    //セーブしたい内容をクラスで用意
    [Serializable]
    public class Status
    {
        public string name;
        public float hp;
        public float exp;
        public int level;
    }
    [SerializeField]
    Status status = new Status();
     [SerializeField]
    Status kakunin = new Status();

    private void Update()
    {
        //セーブ
        if (Input.GetKeyDown(KeyCode.S))
        {
            SaveLoadManager.Save(status, "PlayerStatus","PlayerData");
        }

        //ロード
        if (Input.GetKeyDown(KeyCode.L))
        {
            status = (Status)SaveLoadManager.Load("PlayerStatus", "PlayerData");
        }
    }
}

これは使えるかテストするために用意した簡易的な物なのでもし実用的に使うつもりなのであればManagerクラスを作成してそこで管理させてあげるといいと思います。

実行結果

3anrw-fn0i3.gif

まとめ

まだまだ拡張の余地があると思うので今後もアップグレードしようと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MaterialDesignThemeのスタイル定義一覧

最初に

この記事は、Material Design In XAML Toolkit がインストールされている前提になります。
もし、インストールしていない場合は、プロジェクトを右クリックして、Nuget パッケージの管理から MaterialDesignThemes をインストールしてください。

説明

MaterialDesignThemeを使ってると、「あ、ここのボタンFlatにしたいな」って時に
{StaticResource MaterialDesignFlatButton} とか手入力しないといけない。
そう、面倒くさい...。

面倒くさいということは、改善の余地があるということで。以下、MaterialDesignThemeのスタイルをほぼほぼ定義してみました。

下記のスタイル定義は、以下のリンク先からさらってきました。チュートリアルとかもあるので、使ったことが無い方は一読しておくと良いと思います。

https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit

MaterialDesignTheme のスタイル定義

基本的には要素ごとにまとめて、後はその要素に関わりのあるものも一緒にしてまとめてあります。(ScrollBarならRepeatButtonとかもScrollBarのところに宣言してある)

カラー名は一部変更してます。
[追記] スタイル名も変更しました。

多分、これ必要?みたいなのもあると思いますが、問題があるようなら適宜削除して下さい。

    xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Cyan.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Cyan.xaml" />
            </ResourceDictionary.MergedDictionaries>

            <!--#region MaterialDesign Brush-->
            <SolidColorBrush x:Key="PrimaryLightBrush" Color="{Binding Color,Source={StaticResource PrimaryHueLightBrush}}"/>
            <SolidColorBrush x:Key="PrimaryLightForegroundBrush" Color="{Binding Color,Source={StaticResource PrimaryHueLightForegroundBrush}}"/>
            <SolidColorBrush x:Key="PrimaryMidBrush" Color="{Binding Color,Source={StaticResource PrimaryHueMidBrush}}"/>
            <SolidColorBrush x:Key="PrimaryMidForegroundBrush" Color="{Binding Color,Source={StaticResource PrimaryHueMidForegroundBrush}}"/>
            <SolidColorBrush x:Key="PrimaryDarkBrush" Color="{Binding Color,Source={StaticResource PrimaryHueDarkBrush}}"/>
            <SolidColorBrush x:Key="PrimaryDarkForegroundBrush" Color="{Binding Color,Source={StaticResource PrimaryHueDarkForegroundBrush}}"/>
            <SolidColorBrush x:Key="MaterialDesignBackgroundBrush" Color="{Binding Color,Source={StaticResource MaterialDesignBackground}}"/>
            <SolidColorBrush x:Key="MaterialDesignPaperBrush" Color="{Binding Color,Source={StaticResource MaterialDesignPaper}}"/>
            <SolidColorBrush x:Key="MaterialDesignBodyBrush" Color="{Binding Color,Source={StaticResource MaterialDesignBody}}"/>
            <SolidColorBrush x:Key="MaterialDesignBodyLightBrush" Color="{Binding Color,Source={StaticResource MaterialDesignBodyLight}}"/>
            <SolidColorBrush x:Key="MaterialDesignColumnHeaderBrush" Color="{Binding Color,Source={StaticResource MaterialDesignColumnHeader}}"/>
            <SolidColorBrush x:Key="MaterialDesignCheckBoxOffBrush" Color="{Binding Color,Source={StaticResource MaterialDesignCheckBoxOff}}"/>
            <SolidColorBrush x:Key="MaterialDesignCheckBoxDisabledBrush" Color="{Binding Color,Source={StaticResource MaterialDesignCheckBoxDisabled}}"/>
            <SolidColorBrush x:Key="MaterialDesignTextBoxBorderBrush" Color="{Binding Color,Source={StaticResource  MaterialDesignTextBoxBorder}}"/>
            <SolidColorBrush x:Key="MaterialDesignDividerBrush" Color="{Binding Color,Source={StaticResource MaterialDesignDivider}}"/>
            <SolidColorBrush x:Key="MaterialDesignSelectionBrush" Color="{Binding Color,Source={StaticResource MaterialDesignSelection}}"/>
            <SolidColorBrush x:Key="MaterialDesignFlatButtonClickBrush" Color="{Binding Color,Source={StaticResource MaterialDesignFlatButtonClick}}"/>
            <SolidColorBrush x:Key="MaterialDesignFlatButtonRippleBrush" Color="{Binding Color,Source={StaticResource MaterialDesignFlatButtonRipple}}"/>
            <SolidColorBrush x:Key="MaterialDesignToolTipBackgroundBrush" Color="{Binding Color,Source={StaticResource MaterialDesignToolTipBackground}}"/>
            <SolidColorBrush x:Key="MaterialDesignChipBackgroundBrush" Color="{Binding Color,Source={StaticResource MaterialDesignChipBackground}}"/>
            <SolidColorBrush x:Key="MaterialDesignCardBackgroundBrush" Color="{Binding Color,Source={StaticResource MaterialDesignCardBackground}}"/>
            <!--#endregion-->

            <!--#region MaterialDesign Button-->
            <Style x:Key="MaterialDesignRaisedButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignRaisedButton}"/>
            <Style x:Key="MaterialDesignRaisedLightButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignRaisedLightButton}"/>
            <Style x:Key="MaterialDesignRaisedDarkButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignRaisedDarkButton}"/>
            <Style x:Key="MaterialDesignRaisedAccentButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignRaisedAccentButton}"/>
            <Style x:Key="MaterialDesignFlatButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatButton}"/>
            <Style x:Key="MaterialDesignFlatAccentButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatAccentButton}"/>
            <Style x:Key="MaterialDesignFlatAccentBgButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatAccentBgButton}"/>
            <Style x:Key="MaterialDesignFlatLightBgButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatLightBgButton}"/>
            <Style x:Key="MaterialDesignFlatMidBgButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatMidBgButton}"/>
            <Style x:Key="MaterialDesignFlatDarkBgButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatDarkBgButton}"/>
            <Style x:Key="MaterialDesignOutlinedButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignOutlinedButton}"/>
            <Style x:Key="MaterialDesignToolButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignToolButton}"/>
            <Style x:Key="MaterialDesignToolForegroundButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignToolForegroundButton}"/>
            <Style x:Key="MaterialDesignFloatingActionMiniButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFloatingActionMiniButton}"/>
            <Style x:Key="MaterialDesignFloatingActionButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFloatingActionButton}"/>
            <Style x:Key="MaterialDesignFloatingActionMiniLightButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFloatingActionMiniLightButton}"/>
            <Style x:Key="MaterialDesignFloatingActionMiniDarkButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFloatingActionMiniDarkButton}"/>
            <Style x:Key="MaterialDesignFloatingActionMiniAccentButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFloatingActionMiniAccentButton}"/>
            <Style x:Key="MaterialDesignFloatingActionLightButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFloatingActionLightButton}"/>
            <Style x:Key="MaterialDesignFloatingActionDarkButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFloatingActionDarkButton}"/>
            <Style x:Key="MaterialDesignFloatingActionAccentButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignFloatingActionAccentButton}"/>
            <Style x:Key="MaterialDesignIconButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignIconButton}"/>
            <Style x:Key="MaterialDesignIconForegroundButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignIconForegroundButton}"/>
            <!--#endregion-->

            <!--#region MaterialDesign Calendar-->
            <Style x:Key="MaterialDesignCalendarPortraitStyle" TargetType="Calendar" BasedOn="{StaticResource MaterialDesignCalendarPortrait}"/>
            <Style x:Key="MaterialDesignCalendarButtonStyle" TargetType="CalendarButton" BasedOn="{StaticResource MaterialDesignCalendarButton}"/>
            <Style x:Key="MaterialDesignCalendarDayButtonStyle" TargetType="CalendarDayButton" BasedOn="{StaticResource MaterialDesignCalendarDayButton}"/>
            <Style x:Key="MaterialDesignCalendarItemPortraitStyle" TargetType="CalendarItem" BasedOn="{StaticResource MaterialDesignCalendarItemPortrait}"/>
            <!--#endregion-->

            <!--#region MaterialDesign CheckButton-->
            <Style x:Key="MaterialDesignActionCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignActionCheckBox}"/>
            <Style x:Key="MaterialDesignActionLightCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignActionLightCheckBox}"/>
            <Style x:Key="MaterialDesignActionDarkCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignActionDarkCheckBox}"/>
            <Style x:Key="MaterialDesignActionAccentCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignActionAccentCheckBox}"/>
            <Style x:Key="MaterialDesignCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignCheckBox}"/>
            <Style x:Key="MaterialDesignLightCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignLightCheckBox}"/>
            <Style x:Key="MaterialDesignDarkCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignDarkCheckBox}"/>
            <Style x:Key="MaterialDesignAccentCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignAccentCheckBox}"/>
            <Style x:Key="MaterialDesignUserForegroundCheckBoxStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignUserForegroundCheckBox}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ComboBox-->
            <Style x:Key="MaterialDesignComboBoxStyle" TargetType="ComboBox" BasedOn="{StaticResource MaterialDesignComboBox}"/>
            <Style x:Key="MaterialDesignFloatingHintComboBoxStyle" TargetType="ComboBox" BasedOn="{StaticResource MaterialDesignFloatingHintComboBox}"/>
            <!--#endregion-->

            <!--#region MaterialDesign DataGrid-->
            <Style x:Key="MaterialDesignDataGridCheckBoxColumnStyleStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignDataGridCheckBoxColumnEditingStyle}"/>
            <Style x:Key="MaterialDesignDataGridTextColumnEditingStyleStyle" TargetType="CheckBox" BasedOn="{StaticResource MaterialDesignDataGridTextColumnEditingStyle}"/>
            <Style x:Key="MaterialDesignDataGridTextColumnPopupEditingStyleStyle" TargetType="TextBox" BasedOn="{StaticResource MaterialDesignDataGridTextColumnPopupEditingStyle}"/>
            <Style x:Key="MaterialDesignDataGridCellStyle" TargetType="DataGridCell" BasedOn="{StaticResource MaterialDesignDataGridCell}"/>
            <Style x:Key="MaterialDesignDataGridColumnHeaderStyle" TargetType="DataGridColumnHeader" BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}"/>
            <Style x:Key="MaterialDesignDataGridRowHeaderStyle" TargetType="DataGridRowHeader" BasedOn="{StaticResource MaterialDesignDataGridRowHeader}"/>
            <Style x:Key="MaterialDesignDataGridRowStyle" TargetType="DataGridRow" BasedOn="{StaticResource MaterialDesignDataGridRow}"/>
            <Style x:Key="MaterialDesignDataGridStyle" TargetType="DataGrid" BasedOn="{StaticResource MaterialDesignDataGrid}"/>
            <!--#endregion-->

            <!--#region MaterialDesign DatePicker-->
            <Style x:Key="MaterialDesignDatePickerTextBoxStyle" TargetType="DatePickerTextBox" BasedOn="{StaticResource MaterialDesignDatePickerTextBox}"/>
            <Style x:Key="MaterialDesignDatePickerCalendarPortraitStyle" TargetType="Calendar" BasedOn="{StaticResource MaterialDesignDatePickerCalendarPortrait}"/>
            <Style x:Key="MaterialDesignDatePickerStyle" TargetType="DatePicker" BasedOn="{StaticResource MaterialDesignDatePicker}"/>
            <Style x:Key="MaterialDesignFloatingHintDatePickerStyle" TargetType="DatePicker" BasedOn="{StaticResource MaterialDesignFloatingHintDatePicker}"/>
            <!--#endregion-->

            <!--#region MaterialDesign DialogHost-->
            <Style x:Key="MaterialDesignEmbeddedDialogHostStyle" TargetType="md:DialogHost" BasedOn="{StaticResource MaterialDesignEmbeddedDialogHost}"/>
            <!--#endregion-->

            <!--#region MaterialDesign Expander-->
            <Style x:Key="MaterialDesignExpanderRightHeaderStyleStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignExpanderRightHeaderStyle}"/>
            <Style x:Key="MaterialDesignExpanderLeftHeaderStyleStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignExpanderLeftHeaderStyle}"/>
            <Style x:Key="MaterialDesignExpanderDownHeaderStyleStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignExpanderDownHeaderStyle}"/>
            <Style x:Key="MaterialDesignExpanderUpHeaderStyleStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignExpanderUpHeaderStyle}"/>
            <Style x:Key="MaterialDesignExpanderStyle" TargetType="Expander" BasedOn="{StaticResource MaterialDesignExpander}"/>
            <!--#endregion-->

            <!--#region MaterialDesign GridSplitter-->
            <Style x:Key="MaterialDesignGridSplitterStyle" TargetType="GridSplitter" BasedOn="{StaticResource MaterialDesignGridSplitter}"/>
            <!--#endregion-->

            <!--#region MaterialDesign GroupBox-->
            <Style x:Key="MaterialDesignGroupBoxStyle" TargetType="GroupBox" BasedOn="{StaticResource MaterialDesignGroupBox}"/>
            <Style x:Key="MaterialDesignCardGroupBoxStyle" TargetType="GroupBox" BasedOn="{StaticResource MaterialDesignCardGroupBox}"/>
            <!--#endregion-->

            <!--#region MaterialDesign Hyperlink-->
            <Style x:Key="MaterialDesignBody1HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignBody1Hyperlink}"/>
            <Style x:Key="MaterialDesignBody2HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignBody2Hyperlink}"/>
            <Style x:Key="MaterialDesignCaptionHyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignCaptionHyperlink}"/>
            <Style x:Key="MaterialDesignOverlineHyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignOverlineHyperlink}"/>
            <Style x:Key="MaterialDesignSubtitle1HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignSubtitle1Hyperlink}"/>
            <Style x:Key="MaterialDesignSubtitle2HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignSubtitle2Hyperlink}"/>
            <Style x:Key="MaterialDesignHeadline6HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignHeadline6Hyperlink}"/>
            <Style x:Key="MaterialDesignHeadline5HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignHeadline5Hyperlink}"/>
            <Style x:Key="MaterialDesignHeadline4HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignHeadline4Hyperlink}"/>
            <Style x:Key="MaterialDesignHeadline3HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignHeadline3Hyperlink}"/>
            <Style x:Key="MaterialDesignHeadline2HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignHeadline2Hyperlink}"/>
            <Style x:Key="MaterialDesignHeadline1HyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource MaterialDesignHeadline1Hyperlink}"/>
            <!--#endregion-->

            <!--#region MaterialDesign Label-->
            <Style x:Key="MaterialDesignLabelStyle" TargetType="Label" BasedOn="{StaticResource MaterialDesignLabel}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ListBox-->
            <Style x:Key="MaterialDesignToolToggleListBoxItemStyle" TargetType="ListBoxItem" BasedOn="{StaticResource MaterialDesignToolToggleListBoxItem}"/>
            <Style x:Key="MaterialDesignListBoxItemStyle" TargetType="ListBoxItem" BasedOn="{StaticResource MaterialDesignListBoxItem}"/>
            <Style x:Key="MaterialDesignCardsListBoxItemStyle" TargetType="ListBoxItem" BasedOn="{StaticResource MaterialDesignCardsListBoxItem}"/>
            <Style x:Key="MaterialDesignToolToggleListBoxStyle" TargetType="ListBox" BasedOn="{StaticResource MaterialDesignToolToggleListBox}"/>
            <Style x:Key="MaterialDesignToolToggleFlatListBoxStyle" TargetType="ListBox" BasedOn="{StaticResource MaterialDesignToolToggleFlatListBox}"/>
            <Style x:Key="MaterialDesignListBoxStyle" TargetType="ListBox" BasedOn="{StaticResource MaterialDesignListBox}"/>
            <Style x:Key="MaterialDesignCardsListBoxStyle" TargetType="ListBox" BasedOn="{StaticResource MaterialDesignCardsListBox}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ListView-->
            <Style x:Key="MaterialDesignGridViewItemStyle" TargetType="ListViewItem" BasedOn="{StaticResource MaterialDesignGridViewItem}"/>
            <Style x:Key="MaterialDesignListViewStyle" TargetType="ListView" BasedOn="{StaticResource MaterialDesignListView}"/>
            <!--#endregion-->

            <!--#region MaterialDesign Menu-->
            <Style x:Key="MaterialDesignSeparatorStyle" TargetType="Separator" BasedOn="{StaticResource MaterialDesignSeparator}"/>
            <Style x:Key="MaterialDesignMenuStyle" TargetType="MenuBase" BasedOn="{StaticResource MaterialDesignMenu}"/>
            <Style x:Key="MaterialDesignContextMenuStyle" TargetType="ContextMenu" BasedOn="{StaticResource MaterialDesignContextMenu}"/>
            <Style x:Key="MaterialDesignMenuItemStyle" TargetType="MenuItem" BasedOn="{StaticResource MaterialDesignMenuItem}"/>
            <!--#endregion-->

            <!--#region MaterialDesign PasswordBox-->
            <Style x:Key="MaterialDesignPasswordBoxStyle" TargetType="PasswordBox" BasedOn="{StaticResource MaterialDesignPasswordBox}"/>
            <Style x:Key="MaterialDesignFloatingHintPasswordBoxStyle" TargetType="PasswordBox" BasedOn="{StaticResource MaterialDesignFloatingHintPasswordBox}"/>
            <Style x:Key="MaterialDesignFilledPasswordFieldPasswordBoxStyle" TargetType="PasswordBox" BasedOn="{StaticResource MaterialDesignFilledPasswordFieldPasswordBox}"/>
            <Style x:Key="MaterialDesignOutlinedPasswordFieldPasswordBoxStyle" TargetType="PasswordBox" BasedOn="{StaticResource MaterialDesignOutlinedPasswordFieldPasswordBox}"/>
            <!--#endregion-->

            <!--#region MaterialDesign PopupBox-->
            <Style x:Key="MaterialDesignPopupBoxButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignPopupBoxButton}"/>
            <Style x:Key="MaterialDesignPopupBoxToggleContentStyle" TargetType="md:PackIcon" BasedOn="{StaticResource MaterialDesignPopupBoxToggleContent}"/>
            <Style x:Key="MaterialDesignPopupBoxStyle" TargetType="md:PopupBox" BasedOn="{StaticResource MaterialDesignPopupBox}"/>
            <Style x:Key="MaterialDesignToolPopupBoxStyle" TargetType="PasswordBox" BasedOn="{StaticResource MaterialDesignToolPopupBox}"/>
            <Style x:Key="MaterialDesignToolForegroundPopupBoxStyle" TargetType="md:PopupBox" BasedOn="{StaticResource MaterialDesignToolForegroundPopupBox}"/>
            <Style x:Key="MaterialDesignMultiFloatingActionPopupBoxIconStyle" TargetType="md:PackIcon" BasedOn="{StaticResource MaterialDesignMultiFloatingActionPopupBoxIcon}"/>
            <Style x:Key="MaterialDesignMultiFloatingActionPopupBoxStyle" TargetType="md:PopupBox" BasedOn="{StaticResource MaterialDesignMultiFloatingActionPopupBox}"/>
            <Style x:Key="MaterialDesignMultiFloatingActionLightPopupBoxStyle" TargetType="md:PopupBox" BasedOn="{StaticResource MaterialDesignMultiFloatingActionLightPopupBox}"/>
            <Style x:Key="MaterialDesignMultiFloatingActionDarkPopupBoxStyle" TargetType="md:PopupBox" BasedOn="{StaticResource MaterialDesignMultiFloatingActionDarkPopupBox}"/>
            <Style x:Key="MaterialDesignMultiFloatingActionAccentPopupBoxStyle" TargetType="md:PopupBox" BasedOn="{StaticResource MaterialDesignMultiFloatingActionAccentPopupBox}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ProgressBar-->
            <Style x:Key="MaterialDesignLinearProgressBarStyle" TargetType="ProgressBar" BasedOn="{StaticResource MaterialDesignLinearProgressBar}"/>
            <Style x:Key="MaterialDesignCircularProgressBarStyle" TargetType="ProgressBar" BasedOn="{StaticResource MaterialDesignCircularProgressBar}"/>
            <!--#endregion-->

            <!--#region MaterialDesign RadioButton-->
            <Style x:Key="MaterialDesignRadioButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource MaterialDesignRadioButton}"/>
            <Style x:Key="MaterialDesignLightRadioButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource MaterialDesignLightRadioButton}"/>
            <Style x:Key="MaterialDesignDarkRadioButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource MaterialDesignDarkRadioButton}"/>
            <Style x:Key="MaterialDesignAccentRadioButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource MaterialDesignAccentRadioButton}"/>
            <Style x:Key="MaterialDesignUserForegroundRadioButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource MaterialDesignUserForegroundRadioButton}"/>
            <Style x:Key="MaterialDesignTabRadioButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource MaterialDesignTabRadioButton}"/>
            <Style x:Key="MaterialDesignToolRadioButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource MaterialDesignToolRadioButton}"/>
            <!--#endregion-->

            <!--#region MaterialDesign RichTextBox-->
            <Style x:Key="MaterialDesignRichTextBoxStyle" TargetType="RichTextBox" BasedOn="{StaticResource MaterialDesignRichTextBox}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ScrollBar-->
            <Style x:Key="MaterialDesignScrollBarButtonStyle" TargetType="RepeatButton" BasedOn="{StaticResource MaterialDesignScrollBarButton}"/>
            <Style x:Key="MaterialDesignRepeatButtonTransparentStyle" TargetType="RepeatButton" BasedOn="{StaticResource MaterialDesignRepeatButtonTransparent}"/>
            <Style x:Key="MaterialDesignScrollBarThumbStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignScrollBarThumb}"/>
            <Style x:Key="MaterialDesignScrollBarThumbVerticalStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignScrollBarThumbVertical}"/>
            <Style x:Key="MaterialDesignScrollBarThumbHorizontalStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignScrollBarThumbHorizontal}"/>
            <Style x:Key="MaterialDesignScrollBarStyle" TargetType="ScrollBar" BasedOn="{StaticResource MaterialDesignScrollBar}"/>
            <Style x:Key="MaterialDesignScrollBarMinimalStyle" TargetType="ScrollBar" BasedOn="{StaticResource MaterialDesignScrollBarMinimal}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ScrollViewer-->
            <Style x:Key="MaterialDesignScrollViewerStyle" TargetType="ScrollViewer" BasedOn="{StaticResource MaterialDesignScrollViewer}"/>
            <!--#endregion-->

            <!--#region MaterialDesign Slider-->
            <Style x:Key="MaterialDesignHorizontalTrackRepeatButtonStyle" TargetType="RepeatButton" BasedOn="{StaticResource MaterialDesignHorizontalTrackRepeatButton}"/>
            <Style x:Key="MaterialDesignHorizontalTrackDiscreteRepeatButtonStyle" TargetType="RepeatButton" BasedOn="{StaticResource MaterialDesignHorizontalTrackDiscreteRepeatButton}"/>
            <Style x:Key="MaterialDesignVerticalTrackRepeatButtonStyle" TargetType="RepeatButton" BasedOn="{StaticResource MaterialDesignVerticalTrackRepeatButton}"/>
            <Style x:Key="MaterialDesignVerticalTrackDiscreteRepeatButtonStyle" TargetType="RepeatButton" BasedOn="{StaticResource MaterialDesignVerticalTrackDiscreteRepeatButton}"/>
            <Style x:Key="MaterialDesignSliderThumbStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignSliderThumb}"/>
            <Style x:Key="MaterialDesignDiscreteSliderThumbStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignDiscreteSliderThumb}"/>
            <Style x:Key="MaterialDesignLeftDiscreteSliderThumbStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignLeftDiscreteSliderThumb}"/>
            <Style x:Key="MaterialDesignSliderHorizontalStyle" TargetType="Slider" BasedOn="{StaticResource MaterialDesignSliderHorizontal}"/>
            <Style x:Key="MaterialDesignSliderVerticalStyle" TargetType="Slider" BasedOn="{StaticResource MaterialDesignSliderVertical}"/>
            <Style x:Key="MaterialDesignDiscreteSliderHorizontalStyle" TargetType="Slider" BasedOn="{StaticResource MaterialDesignDiscreteSliderHorizontal}"/>
            <Style x:Key="MaterialDesignDiscreteSliderVerticalStyle" TargetType="Slider" BasedOn="{StaticResource MaterialDesignDiscreteSliderVertical}"/>
            <Style x:Key="MaterialDesignSliderStyle" TargetType="Slider" BasedOn="{StaticResource MaterialDesignSlider}"/>
            <Style x:Key="MaterialDesignDiscreteHorizontalSliderStyle" TargetType="Slider" BasedOn="{StaticResource MaterialDesignDiscreteHorizontalSlider}"/>
            <Style x:Key="MaterialDesignDiscreteVerticalSliderStyle" TargetType="Slider" BasedOn="{StaticResource MaterialDesignDiscreteVerticalSlider}"/>
            <Style x:Key="MaterialDesignDiscreteSliderStyle" TargetType="Slider" BasedOn="{StaticResource MaterialDesignDiscreteSlider}"/>
            <!--#endregion-->

            <!--#region MaterialDesign SnackBar-->
            <Style x:Key="MaterialDesignSnackbarActionButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignSnackbarActionButton}"/>
            <Style x:Key="MaterialDesignSnackbarActionLightButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignSnackbarActionLightButton}"/>
            <Style x:Key="MaterialDesignSnackbarActionMidButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignSnackbarActionMidButton}"/>
            <Style x:Key="MaterialDesignSnackbarActionDarkButtonStyle" TargetType="Button" BasedOn="{StaticResource MaterialDesignSnackbarActionDarkButton}"/>
            <!--#endregion-->

            <!--#region MaterialDesign TextBlock-->
            <Style x:Key="MaterialDesignTextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignTextBlock}"/>
            <Style x:Key="MaterialDesignCaptionTextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignCaptionTextBlock}"/>
            <Style x:Key="MaterialDesignBody1TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignBody1TextBlock}"/>
            <Style x:Key="MaterialDesignBody2TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignBody2TextBlock}"/>
            <Style x:Key="MaterialDesignOverlineTextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignOverlineTextBlock}"/>
            <Style x:Key="MaterialDesignSubtitle1TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignSubtitle1TextBlock}"/>
            <Style x:Key="MaterialDesignSubtitle2TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignSubtitle2TextBlock}"/>
            <Style x:Key="MaterialDesignHeadline6TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignHeadline6TextBlock}"/>
            <Style x:Key="MaterialDesignHeadline5TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignHeadline5TextBlock}"/>
            <Style x:Key="MaterialDesignHeadline4TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignHeadline4TextBlock}"/>
            <Style x:Key="MaterialDesignHeadline3TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignHeadline3TextBlock}"/>
            <Style x:Key="MaterialDesignHeadline2TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignHeadline2TextBlock}"/>
            <Style x:Key="MaterialDesignHeadline1TextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignHeadline1TextBlock}"/>
            <Style x:Key="MaterialDesignButtonTextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource MaterialDesignButtonTextBlock}"/>
            <!--#endregion-->

            <!--#region MaterialDesign TextBox-->
            <Style x:Key="MaterialDesignTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource MaterialDesignTextBox}"/>
            <Style x:Key="MaterialDesignFloatingHintTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource MaterialDesignFloatingHintTextBox}"/>
            <Style x:Key="MaterialDesignFilledTextFieldTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource MaterialDesignFilledTextFieldTextBox}"/>
            <Style x:Key="MaterialDesignOutlinedTextFieldTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource MaterialDesignOutlinedTextFieldTextBox}"/>
            <!--#endregion-->

            <!--#region MaterialDesign Thumb-->
            <Style x:Key="MaterialDesignThumbStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignThumb}"/>
            <Style x:Key="MaterialDesignGridRowHeaderGripperStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignGridRowHeaderGripper}"/>
            <Style x:Key="MaterialDesignGridColumnHeaderGripperStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignGridColumnHeaderGripper}"/>
            <!--#endregion-->

            <!--#region MaterialDesign TimePicker-->
            <Style x:Key="MaterialDesignTimePickerStyle" TargetType="md:TimePicker" BasedOn="{StaticResource MaterialDesignTimePicker}"/>
            <Style x:Key="MaterialDesignFloatingHintTimePickerStyle" TargetType="md:TimePicker" BasedOn="{StaticResource MaterialDesignFloatingHintTimePicker}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ToggleButton-->
            <Style x:Key="MaterialDesignActionToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignActionToggleButton}"/>
            <Style x:Key="MaterialDesignActionLightToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignActionLightToggleButton}"/>
            <Style x:Key="MaterialDesignActionDarkToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignActionDarkToggleButton}"/>
            <Style x:Key="MaterialDesignActionAccentToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignActionAccentToggleButton}"/>
            <Style x:Key="MaterialDesignFlatToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignFlatToggleButton}"/>
            <Style x:Key="MaterialDesignFlatPrimaryToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignFlatPrimaryToggleButton}"/>
            <Style x:Key="MaterialDesignSwitchToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignSwitchToggleButton}"/>
            <Style x:Key="MaterialDesignSwitchLightToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignSwitchLightToggleButton}"/>
            <Style x:Key="MaterialDesignSwitchDarkToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignSwitchDarkToggleButton}"/>
            <Style x:Key="MaterialDesignSwitchAccentToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignSwitchAccentToggleButton}"/>
            <Style x:Key="MaterialDesignHamburgerToggleButtonStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignHamburgerToggleButton}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ToolBar-->
            <Style x:Key="MaterialDesignToolBarVerticalOverflowButtonStyleStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignToolBarVerticalOverflowButtonStyle}"/>
            <Style x:Key="MaterialDesignToolBarHorizontalOverflowButtonStyleStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignToolBarHorizontalOverflowButtonStyle}"/>
            <Style x:Key="MaterialDesignToolBarThumbStyleStyle" TargetType="Thumb" BasedOn="{StaticResource MaterialDesignToolBarThumbStyle}"/>
            <Style x:Key="MaterialDesignToolBarMainPanelBorderStyleStyle" TargetType="Border" BasedOn="{StaticResource MaterialDesignToolBarMainPanelBorderStyle}"/>
            <Style x:Key="MaterialDesignToolBarStyle" TargetType="ToolBar" BasedOn="{StaticResource MaterialDesignToolBar}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ToolBarTray-->
            <Style x:Key="MaterialDesignToolBarTrayStyle" TargetType="ToolBarTray" BasedOn="{StaticResource MaterialDesignToolBarTray}"/>
            <!--#endregion-->

            <!--#region MaterialDesign ToolTip-->
            <Style x:Key="MaterialDesignToolTipStyle" TargetType="ToolTip" BasedOn="{StaticResource MaterialDesignToolTip}"/>
            <!--#endregion-->

            <!--#region MaterialDesign TreeView-->
            <Style x:Key="MaterialDesignTreeViewStyle" TargetType="TreeView" BasedOn="{StaticResource MaterialDesignTreeView}"/>
            <Style x:Key="MaterialDesignExpandCollapseToggleStyleStyle" TargetType="ToggleButton" BasedOn="{StaticResource MaterialDesignExpandCollapseToggleStyle}"/>
            <Style x:Key="MaterialDesignTreeViewItemStyle" TargetType="TreeViewItem" BasedOn="{StaticResource MaterialDesignTreeViewItem}"/>
            <!--#endregion-->

        </ResourceDictionary>
    </Application.Resources>

修正

Brushの定義の所でDynamicResourceにしてたら例外出たので全部、StaticResourceにしました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む