EventHandler与不同类型的发件人

时间:2013-07-28 12:23:36

标签: c# object events windows-phone-8

我正在尝试为我在c#中为Windows Phone 8创建的Type的特定对象实现拖放。我正在使用这样的操作事件:

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

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

如何将对象更改为我想要的类型?

4 个答案:

答案 0 :(得分: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).
}

答案 1 :(得分: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分配事件处理程序。我的解决方案有点难以阅读,但解决了这一点。

最后,哪种解决方案更好地取决于您的品味和需求。

答案 2 :(得分:0)

你不能。

由于您使用此代码new EventHandler<>(..)订阅了某个活动,因此您无法更改sender的类型,因为在EventHandler<>的说明中只有object个发件人:

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

如果您需要创建自己的委托,您可以建立工厂或只是写下:

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

答案 3 :(得分: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
}

YourType替换为您想要的Type(TextBox或您想要的任何内容)