こんにちは私はちょうどそこにクラスを与えるための方法をtheresクリックイベントを所有しているのだろうかと思っていた。例えば、私はカードクラスを持っており、そのクラスから(ユーザーがカードの画像を表示する)矩形をクリックすると知る方法がありますか?クラスのクリックイベントを与えるC#
以上の場合、カードの矩形がクリックされたときを知るにはどうすればよいですか?
こんにちは私はちょうどそこにクラスを与えるための方法をtheresクリックイベントを所有しているのだろうかと思っていた。例えば、私はカードクラスを持っており、そのクラスから(ユーザーがカードの画像を表示する)矩形をクリックすると知る方法がありますか?クラスのクリックイベントを与えるC#
以上の場合、カードの矩形がクリックされたときを知るにはどうすればよいですか?
Windowsから「マウスをここでクリックしました」というメッセージを表示するには、ウィンドウハンドルが必要です。 WinFormsでは、Windows.Forms.Controlから派生したものはウィンドウハンドルを持ち、マウスメッセージを受け取ります。これらのメッセージは、.NET MouseDown、MouseUp、MouseClickなどのイベントの呼び出しに自動的に変換されます。
あなたのカードはおそらくコントロールになるはずです。そうでない場合(例えば、カードの管理と描画を担当する「手」コントロールがある場合)、そのコントロールはマウスイベント(MouseClickなど)を取得し、実際にクリックされたカードを把握する必要がありますコンテキストとマウスイベントの座標
thx man!今私はコントロールを作る方法を学ぶつもりだと思う。 。 。 – Bigfatty
クラスにイベントを簡単に追加することはできますが、何かがクリックされたときにクラスが知る唯一の方法は、それがウィンドウであるかコンポーネントである場合です。
これがコントロールの目的です。このようなイベントを検出できるクラスを作成する必要がある場合は、コントロールを作成することをお勧めします。
実際には、問題の2つの部分があります。最初はイベントを作成し、もう1つは何かに接続します。イベントの作成
は簡単な部分です:
public class Card {
public event EventHandler<MouseEventArgs> Click;
protected void OnClick(MouseEventArgs e) {
EventHandler<MouseEventArgs> handler = Click;
if(handler != null) {
handler(this, e);
}
}
internal void CheckIfClicked(MouseEventArgs e) {
if(/* this mouse event intersects this Card */) {
OnClick(e);
}
}
}
その後、別の場所であなたはいつものように、そのイベントの加入者を設定することができます。
public class CardWatcher {
private Card card;
public CardWatcher(Card card) {
this.card = card;
this.card.Click += card_Clicked;
}
private void card_Clicked(object sender, MouseEventArgs e) {
// Our Card has been clicked; do something about it
}
}
は(私たちは、イベントハンドラをアタッチしていることに注意してくださいこれはGUIを使用してコントロールにイベントハンドラをアタッチした場合、Visual Studioデザイナが生成するコードとほぼ同じコードです)。
そして次にnイベントへの応答の二つの方法は通常あること
public partial class CardContainer : UserControl {
private List<Card> cards = new List<Card>();
public CardContainer() {
InitializeComponent();
// Initialize cards here...
}
protected override void OnMouseUp(MouseEventArgs e) {
foreach(Card card in cards) {
card.CheckIfClicked(e);
}
base.OnMouseUp(e);
}
}
お知らせ:
を取り付けOnEvent
方法
Control
であることを意味します。 Control
を直接サブクラス化するか、またはUserControl
のようなサブクラスを作成することで、このようなクラスを作成するだけで簡単です。デザインビューで作成した他のコントロールのコンテナにすることもできますフォームを作成します)。
だから、あなたの選択肢は次のとおりです。
Card
コントロール自体を作ります。フォームに配置してクリックイベント(およびその他のイベント)を直接受け取ることができます。欠点は、それぞれがWindowsからウィンドウハンドルを割り当てるため、これらの要素が一度にアクティブな場合は、多くのリソースを使用できることです。Card
のコンテナをコントロールにします。このコンテナコントロールはフォームに配置し、クリックイベント(およびその他のイベント)を直接受け取ることができます。欠点は、これらのクリックイベントを個々のカードに委譲する方法を手動で把握する必要があることです。実際のClick
イベントには座標が含まれていないため、おそらくMouseUp
イベントを処理する必要があります。Form
など)にCard
を入れ、そのコンテナのClick
(またはMouseUp
)イベントにハンドラをアタッチします。そのハンドラで、Card
のいずれかがクリックされているかどうかを確認し、それに応じてクリックイベントを委任します。このすべてがCard
自体がCard
のユーザーが購読できることClick
イベントがあるかどうかとは無関係であることを注意。この回答の最初のコードサンプルを見るとCard
のクリックイベントについて知りたいと思っているCardWatcher
のクラスがない限り、Card
ののメソッドは実際に実際のイベントを発生させる必要はありません。 Card
だけがクリックイベントを気にするのであれば、Card.HasBeenClicked(MouseEventArgs e)
のようなメソッドを作成してそこにクリック処理コードを置き、CheckIfClicked
に直接呼び出すことができます。
非常に非常に便利です。 。 。 。どうも! – Bigfatty
PanelやControlなどの適切な「ベース」UIクラスをカプセル化または拡張したいと思うかもしれません。WinFormsやASP.NET、WPFなどを意味するものがいくつかあります。そのクリック事象、何らかの処理(例えば、マウスが領域Xの上にあるときにクリックを登録するだけ)を行い、クライアントが次に接続できるあなた自身の事象をポストする。 [イベントチュートリアル(C#) - WinForms](http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx)を開始する必要があります。ハッピーコーディング。 –
WPFまたはWinForms ...または別のもの? –