1

Windows Phone 8 用に c# で作成した Type の特定のオブジェクトにドラッグ アンド ドロップを実装しようとしています。次のような操作イベントを使用しています。

deck[r[i, j]].card.ManipulationCompleted += new EventHandler<ManipulationCompletedEventArgs>(ImageManipulationCompleted);

private void ImageManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
    //something
}

オブジェクトを必要なタイプに変更するにはどうすればよいですか?

4

4 に答える 4

1

keyboardP のソリューションは問題なく機能します。Tagしかし、個人的には、まさにこの目的のために設計されたコントロールのプロパティに、必要な情報を格納することを好みます。

deck[r[i, j]].card.Tag = deck[r[i, j]];
deck[r[i, j]].card.ManipulationCompleted += ImageManipulationCompleted;

private void ImageManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
    var deck = (Deck)((FrameworkElement)sender).Tag;
}

keyboardP のアプローチの良い点は、目的のオブジェクトをメソッドのパラメーターとして直接受け取るため、読みやすいことです。欠点は、必要なイベントごとにカスタム デリゲートを宣言する必要があり、XAML から直接イベント ハンドラーを割り当てることができないことです。私の解決策は少し読みにくいですが、この点に対処します。

最終的に、どちらのソリューションが優れているかは、好みやニーズによって異なります。

于 2013-07-28T13:50:15.167 に答える
1

あなたができることは、標準のハンドラーtypeを使用する代わりに、あなたを受け取るメソッドを呼び出すことです。ImageManipulationCompletedタイプはわかりませんが、以下を正しいタイプにdeck[r[i, j]]置き換えることができます。MyType

deck[r[i, j]].card.ManipulationCompleted += delegate(object s, ManipulationCompletedEventArgs e){ CardManipulated(s, e, deck[r[i, j]]); };

private void CardManipulated(object sender, ManipulationCompletedEventArgs e, MyType selectedObject)
{
    //you know have access to selectedObject which is of type deck[r[i, j]],
    //the ManipluationCompletedEvents properties if needed,
    //and the actual card Image object (sender).
}
于 2013-07-28T13:13:08.043 に答える
0

ManipulationCompletedEventHandler署名は最初のパラメーターでオブジェクトを使用しています

public delegate void ManipulationCompletedEventHandler(object sender, 
                         ManipulationCompletedRoutedEventArgs e);

したがって、署名を変更することはできませんが、use delegate to typecastいつでもyour typeこのように反対することができます -

deck[r[i, j]].card.ManipulationCompleted += (s, e) => 
           ManipulateMe_ManipulationCompleted((YourType)s, e);

private void ImageManipulationCompleted(YourType sender,
                               ManipulationCompletedEventArgs e)
{
    //something
}

必要なもの(TextBoxまたは必要なもの)に置き換えYourTypeますType

于 2013-07-28T12:39:32.617 に答える
0

できません。

このコードでイベントを購読しているため、 の説明には送信者しか含まれてnew EventHandler<>(..)いないため、 のタイプを変更することはできません:senderEventHandler<>object

public delegate EventHandler<T>(object sender, T eventArgs) where T : EventArgs

独自のデリゲートを作成する必要がある場合は、ファクトリを作成するか、単に次のように記述します。

public delegate EventHandler<T, TArgs>(T sender, TArgs eventArgs) where TTArgs : EventArgs
于 2013-07-28T12:27:15.430 に答える