より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

C#

MaterialDesignXamlでバッジを表示させたい

C#

MaterialDesignXamlでいわゆるバッジを表示させたいな、と ボタンの右上に表示させる方法であるサンプルは用意されています。 xamlだと以下のようになりますね。 <materialDesign:Badged Badge="3"> <Button Content="MAIL" /> </materialDesign:Badged> ただ、私がやりたいのは以下のような形 その場合は以下のようなコード。 <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding CallName.Value}" /> </textblock></stackpanel>

Versionクラスのコンストラクタに文字列が渡せる

C#

docs.microsoft.com Windowsのファイルバージョンといえば、1.2.3.4という4つのセクションに分かれたバージョン体系ですので、であればC#のVersionクラスもそれしか対応していないのかなと思っていたのですが、2.0という文字列でもVersionクラスはよしなに処…

WPFのTreeViewで指定のTreeViewItemまでスクロールする

C#

TreeViewで選択している項目を保存して、アプリを起動し直した時に選択していた項目を復元する といったことを実現したのですが、しかし選択項目までスクロールされないんですね。 それにはBringIntoViewを使います。 しかし、Bindingされているオブジェクト…

やっとBody Styleに慣れたので、Apply Code Body Styleを適用

C#

public string FaceFilename { get { return Path.Combine(DirectoryPath FaceSingleName); } } というコードは、最新のC#では以下のように書くことが可能です。 public string FaceFilename => Path.Combine(DirectoryPath, FaceSingleName); ただ、自分、…

WPF+WndProc+Notification.Wpfで多重起動通知

C#

多重起動の通知にメッセージダイアログを使っていたのですが、いちいちメッセージダイアログでOKするのが面倒。 Windowsの通知とか使えないかなということチャレンジしてみました。 プロセス間通信についてはgRPCとかも考えたのですが、そこまで大掛かりな仕…

意外と奥が深いDialogResult

C#

WinFormsのFormの仕様として、×で閉じると、DialogResultがCancelになります。Alt+F4で閉じても同様です。 docs.microsoft.com FormのDialogResultの返り値を処理する場合は要注意です。 というわけで上記のようなものを作って動作確認してみました。 Formの…

IDisposableを継承したクラスのインスタンスをDisposeしないとどうなるか?

C#

IDisposableを継承したクラスのインスタンスはDisposeしろ 前職では、徹底されていたことです。 ただ、Disposeしなかったら、具体的に何が起きるのか? 復習も兼ねて、実際に起こして見ることにしました。 単純にFormを2つ宣言し、Mainのフォームから何度もF…

Log4netを卒業して、NLogへと

C# C#

社内で新しいデスクトップアプリケーションを開発することになったのですが、ログ出力はどうしようかと考えていたとき思い出しました。 Log4netは開発休止宣言 代替手段はどうするかということでNLogを選ぶことにしました。 Serilogもありますが、GitHubのSt…

Unityで動的に画像を読み込んでスライスする

C#

Unityで動的に画像を読み込んで、指定の矩形を取得する場合 Sprite.Createを用います。以下のようなコード。 var texture = Resources.Load<Texture2D>("Levels/tileset"); var sprite = Sprite.Create(texture, new Rect(32, 0, 32, 32), new Vector2(0.5f, 0.5f)); お</texture2d>…

クラスは参照渡し、構造体は値渡し

C#

C#細かい挙動ですが、大事なことなのでメモ。 クラスは参照渡しですが、構造体は値渡しになります。 using System; public class Program { public static void Main() { var aClass = new AClass() { X = 1 }; var aStruct = new AStruct() { X = 1}; Conso…

Form.Enabled=falseの意外な効用

C#

WinFormsのアプリケーションを開発中に あっ、これ、処理中に他の操作されたらダメじゃん こういうことって網羅的なテストでは盲点になりがちですよね。 で、ツールだからざっくり一括でコントロール全体をDisabledにしたいということで、親となるFormのEnab…

MaterialDesignXamlのPackIconは色を付けられる

C#

小ネタですが、思い込みがあって気づいたのでメモ。 MaterialDesignXamlにはPackIconとして MaterialDesginのアイコンを表示する機能があります。 これですが、デフォルトではモノクロですが、色をつけることが可能です <materialDesign:PackIcon Kind="InformationCircle" Foreground="LightSkyBlue" Width="18" Height="18" /> 単純にForegroundプロパティを指定す</materialdesign:packicon>…

String.Splitするとき、対象の文字列に区切り文字がなくても例外にはならない

C#

完全に小ネタなのですが、へーと思った話を。 C#にはString.Splitという関数が存在します。 docs.microsoft.com これはカンマなどで文字列を区切る処理なのですが、文字列に指定した区切り文字がなくても例外にはなりません。 using System; public class Pr…

ReadOnlyReactivePropertyを使う

C# C#

だいぶ、 ReactivePropertyを使ったのですが、まだReadOnlyReactivePropertyを使いこなしてませんでした。 QuickConverterもあるが、ConvertBackを使わない表示用だけだったら、こっちの方がプログラムで複雑なロジックもかけます。 CombineLatestも使えるの…

C#には CurrentCultureとCurrentUICultureの二つがある

C#

C#には CurrentCultureとCurrentUICultureの二つがあります。 CurrentCultureは日付形式などのフォーマットを扱う CurrentUICultureはメッセージなどを扱う 一つにしてくれよと言いたいところですが、この概念があるから、メッセージは英語表記だけど、日付…

WPFのTreeViewをドラッグ&ドロップできるようにする

C#

以下の記事を参考にさせてもらいました。 aonasuzutsuki.hatenablog.jp 同じ方のGitHubにあるようにBehaviorsにした方が良いです。 SavannahManager/TreeViewItemInfoBase.cs at master · AonaSuzutsuki/SavannahManager · GitHub SavannahManager/MoveableT…

WPFのTreeViewのIsExpandedがViewModelに反映されない

C#

WPFのTreeViewですが、ツリーのノードを開いた状態を扱うプロパティはIsExpandedです。 このプロパティ、どうしてBindingしているのに、コントロールの状態が ViewModelに反映されないんだろうとハマっていました。 ViewModel側からプロパティを変更すると、…

UserControlのSliderを領域全体に表示したい

C#

WPFのSliderコントロールですが、UserControl上のSliderなど、小さいサイズになってしまうことがあります。 Why? <StackPanel> <Slider Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel}}" /> </StackPanel> とStackPanelで囲んで、親のサイズに合わせるようにすると良いみたいです。 stackoverflow.com

ReactivePropertyでプロパティ以外の値も使って複雑な検証をしたい

C#

検索すると、ValidationAttributeを宣言する方法などが出てくるのですが もっと複雑な値の検証がしたいんだけど! ってなって、探しました。 searchcode.com public Hoge { get; set; } = new ReactiveProperty<bool>(); のように宣言して、以下のように Hoge .Set</bool>…

MainWindowやMainWindowViewModelを格納する名前空間の命名をどうしようか悩んだ

C#

MainWindowやMainWindowViewModel、その関連のクラスを格納する名前空間の命名に困ってました。 そのまま直下でいいんですが、WPFアプリケーションだと、ViewsとViewModelsなどと、また分けたいのです。 まんまだとMainでいいんですが、クラス名と混同しない…

iTunes has not been found. Please ensure to have a valid iTunes installation in order to communicate with Apple devices in Windows

C#

XamarinがまたMacと接続できなくなってしまいました。 例によって、Visual Studioの出力ウインドウを確認すると iTunes has not been found. Please ensure to have a valid iTunes installation in order to communicate with Apple devices in Windows iTu…

在在出在出、出は何文字?

C#

在出出在出出出出出出出出出出出出出出出出休出出 これ私の3月の出社・在宅状況なのですが、何日出社したっけと思いました。 スプレッドシートなので、COUNTIFを使えば一発でわかるものなんですが、指定の文字が何文字あるか? ってプログラムで書くと、どう…

Convert to method groupとは?

C#

C# のコードを書いていると、以下のようなコード支援が Convert to method group あー、なるほどね。と static void Main(string[] args) { var a = new List<int>() {1, 3, 4, 5}; var b = a.Select(i => IsOdd(i)).ToList(); } static bool IsOdd(int i) { retu</int>…

WPFのKeyDownでSpaceキーの判定ができない。PreviewKeyDownを用いる

C#

ListBoxのKeyDownイベントでSpaceキーを入力された時の判定をしようとしたのですが、出来ないようです。 なので、PreviewKeyDownイベントで行う必要があります。 Spaceキーのようなコントロールの操作に使う特別なキーについてはPreviewKeyDownで止まってし…

WPFのKeyDownイベントでKey.Systemとなってしまう場合は、e.SystemKeyで判定

C#

if ((modifiers & ModifierKeys.Alt) != ModifierKeys.None) { switch (e.Key) { case Key.Up: ShiftUpCommandToolStripMenuItem_Click(null, null); break; case Key.Down: ShiftDownCommandToolStripMenuItem_Click(null, null); break; } } 上記のような…

やっぱりAdd brace。中括弧つけませんか

C#

今の職場って、C#のコードを if (a==b) return; というのはまだしも if (a==b) return; とすることがあるようです。 個人的には一行でも if (a==b) { return; } と中括弧で囲って欲しいなぁと思ってました。 というのも中括弧で囲わない場合は、一行ならいい…

WPFのユーザーコントロール側からショートカットキーを設定する

C#

以下のようなOK/Cancelのコントロールを作成して各画面に配置していたのですが、OKといったらAlt+Oのショートカットキーでしょうと。 素直にXAMLでWindow.InputBindingsを指定して回るのも手間だなあということで、以下のようにしてみました。 public OkCanc…

WindowsFormsHost上にWPFのContextMenuを表示する

C#

WPFだけど、WinFormsが使いたい。 そういう時はあります。PictureBoxなんてImageより使い勝手がいいですし。 WinFormsなんだけど、コンテキストメニューはWPFのものを使いたいということはあります。 そうしないと古臭いUIが見え隠れしてしまうので <WindowsFormsHost> <WindowsFormsHost.ContextMenu> <ContextMenu x:Name="ContextMenu1" > <MenuItem Header="Menu item 1" /> <MenuItem Header="Menu item 2" /> </menuitem></menuitem></contextmenu></windowsformshost.contextmenu></windowsformshost>

WPFのImageでMouseLeftButtonDownイベントが反応しない

C#

ImageのMouseLeftButtonDownイベントが反応しないということがありました。 最初はImage Sourceがnullになっているので、それが関係しているかもなあ。 待てよ、他で実装した時は上手く言ったはず。 Gridで囲んでBackgroundを指定すると上手く機能しました。…

QuickConverterでIntegerをboolに変換する

C#

いちいちConverterクラスを作成しなくても、手軽にConverterの動きを行えるのがQuickConverterです。 github.com 毎回、ユースケースに合わせて Converterを作成してはキリがないので、このライブラリは優れ物ですね。 QuickConverterを使ったIntegerをbool…