DOBON.NET DOBON.NETプログラミング掲示板過去ログ

canvas内の特定のコントロールを取り出したい

環境/言語:[WindowsXP,C#,WPF]
分類:[.NET]

こんにちは。

さて、C#からWPFへ移行する際に以下の条件で画面を移行してます。

・C# 側 ・・・ Panel(pnlMain)内にボタンを10個配置(btnMenu1 〜 btnMenu10)
・WPF側 ・・・ Canvas(cnvMain)内にボタンを10個配置(btnMenu1 〜 btnMenu10)

この場合にC#では、以下のように特定のボタン(btnMenuX) を取り出す事が可能なのですが、

Control[] ctl = pnlMain.Controls.Find("btnMenu" + X, false);
((Button)ctl[0]).Text = "ボタン名称";

WPFで同様の記述をすると、canMain.Controls.Findでエラーになります。

WPFで特定のコントロールを取得する方法があるのでしょうか?
現在はCanvas内のコントロールをforeach で1個ずつ回していき、コントロール名の名前を
チェックをしているのですが、C#と同様の事が可能であれば教えていただけないでしょうか?

行おうをしている事は、別のマスタで使用したいボタンNOを登録してあり(ここでいう所の X です)
マスタを読み込みながら、そのボタンだけ使用可能にしたいのです。


よろしくお願いします。
> さて、C#からWPFへ移行する際に以下の条件で画面を移行してます。
意味が分かりません。WPF でも C# を普通に使用します。
軸としては
[フレームワーク] WinForm <-> WPF
[言語] XAML <-> C#
です。XAML と C# は併用することが多いですけどね。WinForm と WPF も併用できますし。
で、WinForm から WPF へ移行しようということですよね?

> Control[] ctl = pnlMain.Controls.Find("btnMenu" + X, false);
> ((Button)ctl[0]).Text = "ボタン名称";
>
> WPFで同様の記述をすると、canMain.Controls.Findでエラーになります。

WPF と WinForm では使用するクラスが全く異なります。同じ名前でも別物です。大胆に設計が変わっているため、コードの流用はおおよそ不可能です。
例えば WPF の Button(System.Windows.Controls.Button クラスです。WinForm の Button は System.Windows.Forms.Button クラス)に Text プロパティは存在していません。
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.button_properties.aspx
内容は Content プロパティで表現され、文字列以外にも様々なものが格納できます。
Canvas(System.Windows.Controls.Canvas)も Controls プロパティを持ちません。
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.canvas_properties.aspx
子要素は Children プロパティに格納されます。
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.panel.children.aspx
Children プロパティは UIElementCollection 型ですが、残念ながらこれには名前で検索するメソッドや名前を指定するインデクサは存在しません。
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.uielementcollection_members.aspx
foreach でループして一つ一つ Name プロパティをチェックしていくことになるでしょう。
しかし Canvas は FrameworkElement から派生しているため、FindName メソッドで検索することが可能です。
http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.findname.aspx
ただしこれは対象が子要素ではなく「現在の要素の名前スコープ」ですけど(詳しくは上の FindName メソッドの解説に詳細へのリンクがありますのでそちらをご覧ください)。

また、XAML を使っているのなら、x:Name 属性を設定することで、対応するコードから直接フィールドとして扱うことも可能です。当然、動的な要素には使えませんけどね。
■No23165に返信(Hongliangさんの記事)
>>さて、C#からWPFへ移行する際に以下の条件で画面を移行してます。
> 意味が分かりません。WPF でも C# を普通に使用します。
> 軸としては
> [フレームワーク] WinForm <-> WPF
> [言語] XAML <-> C#
> です。XAML と C# は併用することが多いですけどね。WinForm と WPF も併用できますし。
> で、WinForm から WPF へ移行しようということですよね?

はい、仰るとおりです。
改めて読み返してみると、本当に変なことを書いていたと反省しました。

> しかし Canvas は FrameworkElement から派生しているため、FindName メソッドで検索することが可能です。
> http://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.findname.aspx

ここを参考にして変更を行い、自分がしたかったことは実現できました。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板