質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

6486閲覧

WPF クラス外にあるメソッドをイベントハンドラに追加する方法が分かりません

gucha

総合スコア55

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/05/15 16:40

コードビハインドでコントロールを作成するためのクラスを作ろうとしているのですが、そのクラス内でイベントハンドラにメソッドを追加する方法が分かりません。
同じフィールドでは登録できました。

C#

1 public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 InitializeComponent(); 6 Button btn = new Button(); 7 btn.Click += new RoutedEventHandler(Button_Click); //この方法は上手くいきました 8 } 9 10 private void Button_Click(object sender, RoutedEventArgs e) 11 { 12 13 } 14 15 public class botan 16 { 17 public Button btn = new Button(); 18 public botan() 19 { 20 this.btn.Click += new RoutedEventHandler(Button_Click); //メソッドが参照できずに登録できません 21 } 22 } 23 }

別のクラスにメソッドを作りインスタンスから呼び出す方法も考えました。

C#

1 public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 InitializeComponent(); 6 } 7 8 public class botan 9 { 10 Button btn = new Button(); 11 public botan() 12 { 13 methods m = new methods(); 14 this.btn.Click += new RoutedEventHandler(m.Button_Click); 15 } 16 } 17 } 18 19 public class methods 20 { 21 public void Button_Click(object sender, RoutedEventArgs e) 22 { 23 24 } 25 }

この場合botanを作成する時に別のクラスのインスタンスも作成することになりますが、メモリ負荷が増えたりするのでしょうか?
膨大な量のインスタンスを作成する場合もあると思うので知っておきたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mituha

2018/05/15 23:12

WPFですとDataTemplateを使用するのが普通だと思いますが、`コードビハインドでコントロールを作成するためのクラスを作ろうとしている` 理由の追記は可能ですか?
gucha

2018/05/16 04:59

DataTemplateを使った動的作成方法を今まで知らなかったので・・・。少しだけ調べてDataTriggerなどの存在も知りました。今までReactive Extensionsでバインドした値を変更させていました。DataTemplateを使ったほうが管理がしやすかったり、軽くなったりするのでしょうか?
mituha

2018/05/16 06:41

軽くなるかはわかりませんが、DataTemplate自体がコントロールを生成するWPFの仕組みですので、コントロール生成の別な仕組みを再発明する必要はないかと思います。
gucha

2018/05/16 06:59

知っておくと出来ることが増えると思うのでDataTemplateの使い方も勉強しようと思います。教えていただきありがとうございます。
guest

回答1

0

ベストアンサー

public class botan { public Button btn = new Button(); public botan(MainWindow mainWindow) { this.btn.Click += new RoutedEventHandler(mainWindow.Button_Click); } }

みたいにすればいいだけでは。
まぁ、俺は絶対にこんなコード書かないけど。依存関係が密すぎる。

あと、C#では、インスタンスを作ることでメモリーとか食うけど、今時のメモリーは8Gとかなので、100万個つくるとかそういうことをしなければ、大体大丈夫です。たぶん。

投稿2018/05/15 17:16

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gucha

2018/05/15 18:05

botan b = new botan(this); でクラス内でイベントを追加できることを確認しました。 これだと余分なインスタンスを作成せずにコード量が減るので良いと思いましたが問題点もあるのですね。 依存関係が密すぎるとはどういうことなのでしょうか? 使い回しが効きにくくなり後々面倒になるということですか? 当方共同で開発した経験がなく規模も小さいものばかりなので、クラスも増えるとアクセスの記述が長くなったりとあまり良いイメージがないのですがやはりしっかりと分けて作ったほうが良いのでしょうか?(そういう話ではない?)
Zuishin

2018/05/15 22:41

https://teratail.com/questions/70543 依存度の強さに関してはここのベストアンサーがわかりやすいです。 依存度が可能な限り低くなるよう作ると美しく保守しやすいプログラムになります。 この質問の場合はイベントハンドラを使い回していますが、私ならそれはしません。 使い回すならパブリックメソッドにします。
gucha

2018/05/16 04:42

分かりやすい説明でイメージがより鮮明になりました。 すぐに作れと言われてもうまく作れる自信はありませんが、やはり意識して依存度を低くした方が良いと理解できました。 教えて頂きありがとうございました。
MMashiro

2018/05/16 04:53

余談ですがWPFで疎結合でしたらPrismというMS公式のフレームワークを使用すればMVVMを簡単に実現できるのでおすすめです
gucha

2018/05/16 07:01

Prismというワードは知っていたのですが利用したことがなかったので、併せて勉強してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問