カップ麺シリーズ:一から学べるWPF における CommunityToolkit.Mvvm(MVVM ToolKit) 覚え書き(3) メッセージングの簡単なサンプル

プロジェクトの準備 この記事では、メッセージングの利用自体は簡単であることを実感してもらうため、 コンソールアプリケーションでの、新規プロジェクトによるサンプルとなります。 Visual Studioから「新しいプロジェクト」で「C#」「Windows」経由で「コンソール アプリ」を選び、 プロジェクト名は「MessagingTest」にして、ソリューションを作成してください。今回はプロジェクト名を変更しても問題ありません。 フレームワークは「.NET 9.0」を使用します。 MVVM Toolkfit の利用準備 ソリューションに対し、Visual Studioのメニュー「ツール」「NuGetパッケージマネージャ」から「ソリューションのNuGetパッケージの管理」を選び、「参照」タブから CommunityToolkit.Mvvm をインストールします。 (1)基本のメッセージング まずは Program.cs を全削除し、以下の内容に置き換えます。 この際、コピペでは身につかないとか言いません。プロジェクトを作って動かせば、見えてくるものもあるでしょう。 using CommunityToolkit.Mvvm.Messaging; namespace MessagingTest { /// <summary> /// 送信クラス(Main含む) /// </summary> public static class Sender { public static void Main() { // 保持する必要はないが、ここでは受信クラスを作る必要がある var _ = new Receiver(); // 弱い参照でのメッセージング var message = new MyMessage("もりゃき", 12); WeakReferenceMessenger.Default.Send(message); // メッセージが出力されるまで待機 Console.ReadKey(); } } /// <summary> /// 受信クラス /// </summary> public class Receiver { public Receiver() { // 弱い参照での受信設定 WeakReferenceMessenger.Default.Register<MyMessage>(this, HandleRegistrationInfo); } // 受信メッセージの処理メソッド private void HandleRegistrationInfo(object recipient, MyMessage message) { Console.WriteLine($"{message.Name} の所持金は {message.Value} 円。"); } } /// <summary> /// メッセージクラス /// </summary> public class MyMessage { public string Name { get; set; } = string.Empty; public int Value { get; set; } public MyMessage() { } public MyMessage(string name, int value) { Name = name; Value = value; } } } こうすると、以下の出力になります。 ...

2024年05月26日 · (2025年09月11日 更新) · 4 分 · ☨もりゃき.xyz☨

カップ麺シリーズ:一から学べる、WPF における CommunityToolkit.Mvvm(MVVM ToolKit) 覚え書き(2) 依存性注入を利用した簡単なサンプル

前提条件 まずは 「WPF における MVVM ToolKit覚え書き(1) 簡単な依存性注入とデータバインディング」 を完読して、プロジェクトを作成してください。 DIを使うための、新しいウィンドウ ViewName を作成する ソリューションエクスプローラーで「Views」フォルダで「追加」から「ウィンドウ(WPF)」を選び、名前に ViewName.xaml と設定してウィンドウを作成します。 そして以下のように置き換えます。 <Window x:Class="NameTest.Views.ViewName" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:NameTest.Views" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="ViewName" Width="800" Height="450" mc:Ignorable="d"> <Grid VerticalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Label Grid.Row="0" Width="300" Height="30" Content="あなたの名前" /> <TextBox Grid.Row="1" Width="300" Height="30" Text="{Binding Username, UpdateSourceTrigger=PropertyChanged}" /> </Grid> </Window> 次に、ViewModels フォルダにおいて「追加」から「クラス」を選び、名前に ViewNameViewModel.cs と設定してクラスを追加します。 内容は無視して以下のように書き換えます。 using CommunityToolkit.Mvvm.ComponentModel; namespace NameTest.ViewModels { public interface IViewNameViewModel; public class ViewNameViewModel : ObservableObject, IViewNameViewModel { private string _username = string.Empty; public string Username { get => _username; set => SetProperty(ref _username, value); } } } そして、このViewModelをDIコンテナに登録します。App.xaml 直下にある App.xaml.cs を開いてください。 ...

2024年05月25日 · (2025年09月11日 更新) · 3 分 · ☨もりゃき.xyz☨

カップ麺シリーズ:一から学べるWPF における CommunityToolkit.Mvvm(MVVM ToolKit) 覚え書き(1) 簡単な依存性注入とデータバインディング

プロジェクトの準備 Visual Studioから新しいプロジェクトで「C#」「Windows」経由で「WPFアプリケーション」を選び、プロジェクト名は「UsernameTest」にして、ソリューションを作成してください。これでソリューションも UsernameTest になります。説明通りに動かないことを避けるため、この記事に関しては可能な限りソリューション名を UsernameTest にしてください。 フレームワークは「.NET 9.0」を使用します。 この「WPF における CommunityToolkit.Mvvm 覚え書き」シリーズは、ある程度のMVVM知識を有していることを前提としております! 簡単に言うとViewは見た目、ViewModelはViewにデータバインディグする関連の処理、Modelはアプリケーションのコアとなる処理群ですね。大規模プロジェクトなら、おそらくModelが一番大きくなります。 MVVM Toolkit の利用準備 ソリューションに対し、Visual Studioのメニュー「ツール」「NuGetパッケージマネージャ」から「ソリューションのNuGetパッケージの管理」を選び、「参照」タブから CommunityToolkit.Mvvm をインストールします。 Microsoft.Extensions.DependencyInjection も同様にインストールします。 もちろん理解している方なら、コマンドからInstall-Package CommunityToolkit.Mvvm等としても構いません。 Ioc - 制御の逆転って? DI(依存性注入)については、簡単に言うと、オブジェクトの生成や依存関係の解決を外部(具体的には後に出てくる App.xaml.cs)に委譲することで、コードの柔軟性とテストの容易さを向上させるパターンです。この記事では、具体的な手順を通じてDIの使い方を学びます。 何より大切なのは、自分でソリューションを作り、手を動かすことです。コピペしても何も習得できず、応用が利きません。 App.xaml の書き換え まずは MVVM としてのスタンダードとして、プロジェクト直下に [追加] から [新しいフォルダ] を利用して Views 、ViewModels そして Models フォルダを作ります、(今回は Models 使わないので省いていいですけど、一般的な構成として覚えておいてください、すなわち大規模アプリケーション開発に直接アドバイスする記事ではありません)。 プロジェクト直下にある MainWindow.xaml を Views にドラッグドロップで移動します。移動時、名前空間も調整してください。 そして App.xaml を以下のように調整してください。 <Application x:Class="UsernameTest.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:UsernameTest" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application> から <Application x:Class="UsernameTest.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:UsernameTest" StartupUri="Views/MainWindow.xaml"> <Application.Resources /> </Application> と変更します。StartupUri の行に Views フォルダを追加するだけです。 ...

2024年05月20日 · (2025年09月11日 更新) · 3 分 · ☨もりゃき.xyz☨

カップ麺シリーズ:C#でSHGetFileInfoをDllImportからLibraryImportに書き換え

最低限DllImportの使い方を理解している方を対象にしています。この記事をコピペで利用した際の責任は一切負いません あの、C# で Windowsのファイルアイコンやら色々な情報を獲得する SHGetFileInfo の宣言を、DllImportからLibraryImportに書き換えて、憎きSYSLIB1054を一つ撲滅する方法をお伝えします。 まず、C# での DllImportのパターンは、よく見るのはこういう宣言ですね。 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct SHFILEINFO { public IntPtr hIcon; public int iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; }; [DllImport("shell32.dll", CharSet = CharSet.Unicode)] private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttribs, ref SHFILEINFO psfi, uint cbFileInfo, SHGFI uFlags); そして SHGETFILEINFO の使い方はこんな感じですよね? SHFILEINFO shinfo = new(); IntPtr shFileInfoResult; // ここ shFileInfoResult = SHGetFileInfo(path, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI.SHGFI_ICON | SHGFI.SHGFI_SMALLICON | SHGFI.SHGFI_TYPENAME); if (shFileInfoResult == IntPtr.Zero || shinfo.hIcon == IntPtr.Zero) { int lastError = Marshal.GetLastWin32Error(); throw new Exception($"SHGetFileInfo Failed with error code {lastError}"); } BitmapSource icon = Imaging.CreateBitmapSourceFromHIcon(shinfo.hIcon, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); DestroyIcon(shinfo.hIcon); // あとはiconとshinfo.szTypeNameでアイコンとファイル種類が手に入る で、今となっては C# の DllImport を使った SHGetFileInfo に警告 SYSLIB1054 が出てくる、という状況です。 ...

2023年12月14日 · 2 分 · ☨もりゃき.xyz☨

TwitterとFacebookをBANしました

えっと、WPF Prismの記事更新を放置しながら申し訳ないのですが… TwitterとFacebookを、俺からBANしました。 ...

2020年12月03日 · 1 分 · ☨もりゃき.xyz☨

Windowsベースのショートカット論考

まずは、Windowsの「Ctrl」と組み合わせて使われる、一般的なショートカットを列挙しよう。 これは、Windows7のユーザーエクスペリエンスガイドラインから抜粋したものとなる。 ...

2020年01月06日 · (2025年04月23日 更新) · 1 分 · ☨もりゃき.xyz☨

rdpまわり雑まとめ

結論:VNCよりRDP使っとけばよさそう。 ...

2019年11月26日 · 1 分 · ☨もりゃき.xyz☨

Huawei Mediapad T2 10.0にLineageOS導入

Huawei Mediapad T2 10.0 Proへのカスタムロム導入。 やりたいなー、けど踏ん切り付かないなぁ、と思っていたタブレット(Android 5.1!)への、カスタムロム LineageOS を入れるか否かを某SNSでアンケート取ったところ… ...

2019年11月21日 · 1 分 · ☨もりゃき.xyz☨

Realforceの修理記録

「Realforceの修理」と書くと、なんか凄い話に見えてしまうが、ただの断線修理です。 こちらの写真をご覧ください… ...

2019年10月14日 · 1 分 · ☨もりゃき.xyz☨

ショートカットキーの乱立に物申す

あちこちで勝手に作られるショートカットキー達! 結論から言う。 ショートカットキー、お前ら全員一旦捌けてくれる? ...

2019年03月31日 · 1 分 · ☨もりゃき.xyz☨