1

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

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

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

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

4

4 回答 4

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 回答
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 回答
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
于 2013-07-28T12:27:15.430 回答
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(文本框或任何您想要的东西)

于 2013-07-28T12:39:32.617 回答