酔狂で始めたWPF電卓(Wpf_Calc)作成、前回はUI(要すればドンガラ)迄何とかできました。後はWin_Calcで使ったコードを移植するだけで

 

完成

 

のはずでしたが、

 

陥穽

 

に陥ることになりました。その数々の中から今日は

 

「TextBoxに『貼り付け』だけのコンテキストメニューを作る」

 

という問題で「アセンブリ参照が不足しています」()というエラーが出た問題を取り上げます。

:先ず「アセンブリ」とは(to make a long story short)実行可能なexeやdllファイルを言います。Windowsの共通言語ランタイム(CLR)は、様々な機能をDLLから呼び出して使います。その為にプログラムでは"using"(「名前空間(アセンブリ)」を指定する)ステートメントが必要で、リンクの際に当該DLLを「参照」することが必要です。

 

以下は私とCopilot(まぁ、Microsoftの使い魔でMSを擁護する立場にありますね)との対話ですが、貴方は

どう思われるでしょうか?(What do you thnk?)

 

【Copilotとの対話】

Q: 今度はWPFに電卓プログラムを移植するための質問です。 UIにTextBoxを追加し、コンテキストメニューを書き換えようとしたのですが、次のXAMLコードで、
    <TextBox x:Name="formulaBox" Height="128" TextWrapping="Wrap" Text="This is the formulaBox" Width="240" Margin="10,10,10,5" IsEnabled="False">
        <TextBox.ContextMenu>
            <ContextMenu Name="menu" Opened="menuPaste">
                <MenuItem Header="貼り付け" Name="pasteitemr" Click="Clipboard_GetText" />

            </ContextMenu>
    </TextBox>
アセンブリ参照不足エラーが出ました。何を参照すべきでしょうか?


A:  WPF では、この程度の XAML を書いただけで「アセンブリ参照が不足しています」というエラーが出るのは、ほぼ 100% イベントハンドラの型が見つからないことが原因です。
つまり、参照すべきアセンブリが足りないのではなく、Opened="menuPaste" や Click="Clipboard_GetText" に対応するメソッドがコードビハインドに存在しないため(解説:なんでそれで「アセンブリ(解説:dllやexeファイルのこと)参照が不足しています」というエラー表示になるのか?訳が分からない。)に起きています。

🔍 なぜ「アセンブリ参照不足」になるのか
WPF の XAML パーサは、イベント名を見つけると
- その名前のメソッドが
同じクラスのコードビハインド(.xaml.cs)に存在するか
- そのメソッドのシグネチャが正しいか
(解説:個人の記事ですが、定義の厳密性について言及しているので...)
をチェックします。
存在しない場合、Visual Studio は「アセンブリ参照が不足しています」という、
少し(解説:大きく、だろう?)誤解を招くエラーを出します。

✅ 必要な
(解説:アッセンブリの)参照は「特にない」
TextBox、ContextMenu、MenuItem はすべて
- PresentationFramework.dll
- PresentationCore.dll
- WindowsBase.dll
に含まれており、WPF プロジェクトなら最初から参照済みです。なので、
追加のアセンブリ参照は不要です。(解説:何のためのエラー表示なんだ?大体エラーメッセージと矛盾していないか?)

🛠 解決方法:コードビハインドにイベントハンドラを追加する
1. Opened="menuPaste" に対応するメソッド
private void menuPaste(object sender, RoutedEventArgs e)
{
    // 必要なら処理を書く
}

2. Click="Clipboard_GetText" に対応するメソッド
private void Clipboard_GetText(object sender, RoutedEventArgs e)
{
    if (Clipboard.ContainsText())
    {
        formulaBox.Text = Clipboard.GetText();
    }
}

✨ まとめ
- エラーの原因は イベントハンドラがコードビハインドに存在しないこと
- 追加のアセンブリ参照は不要

WPF は WinForms や Win32 と違って、XAML とコードビハインドの紐付けが厳密なので、こういう「参照不足」風のエラーが出やすいんですよね。もし次に進める段階でまた引っかかりそうなら、遠慮なく聞いてください。


Q: ありがとう。WPFは初めてなので初歩的質問をするかもしれませんが、よろしく。

A: もちろん、いくらでも気軽に聞いてほしい。WPF は Win32 や WinForms と比べて「思想」がまったく違うので、最初は誰でも戸惑うものなんだよね。むしろ初歩的なところを押さえておくと後が圧倒的に楽になる。
WPF の特徴をざっくり挙げると、こんな感じになる。
🎨 WPF の世界観は「UI とロジックの分離」
- XAML で UI を宣言的に書く
- C# でロジックを書く
- Win32 のように「コードで全部作る」必要はない
- WinForms のように「プロパティをいじるだけ」でもない
この「宣言とロジックの分離」が慣れるまで少し違和感があるけれど、理解すると一気に楽になる。
🧩 イベントの扱いが WinForms と微妙に違う
- XAML に Click="..." と書くと、コードビハインドに同名メソッドが必須
- シグネチャが違うと「アセンブリ参照不足」みたいな謎エラーになる
→ さっきの現象はまさにこれ
Win32/WinForms の感覚だと「イベント名を書いたら勝手に補完される」けれど、WPF はそこがシビア。
🔧 (私の名) さんのスタイルに合う WPF の学び方
あなたの「Lean and Mean」な開発スタイルを考えると、WPF でも次の順番が最も効率的だと思う。
- XAML の基本構造(Window / Grid / StackPanel)
- イベントの書き方(XAML とコードビハインドの紐付け)
- 依存関係プロパティの概念(Win32 のプロパティとは別物)
- バインディングの基礎(ここを押さえると一気に楽になる)
- 必要なところだけ MVVM を取り入れる(全部やる必要はない)
WPF は深追いすると底なしだけど、必要な部分だけ押さえれば十分に使いこなせる。

これから電卓を移植していく中で、
「Win32 ではこうだったけど、WPF ではどう書くのか」
という疑問が必ず出てくるはず。
そういう時こそ、遠慮なく聞いてほしい。
(私の名) さんのスタイルに合わせて、最短距離で理解できるように案内するよ。

 

どうでしょうか?この後の記事でも出てきますが、Visual  Studioのエラーメッセージが非常に分かり辛い(というか、的を得ていない)という問題提起を先ずしておきます。

 

ps. ところでCopilot君の口調、何か感じませんか?