2013-07-28 29 views
1

我試圖實現拖放的,我已經在C#創建Windows Phone的一個類型的特定對象8.我使用操作事件是這樣的:事件處理程序與不同類型的發送者

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

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

如何將對象更改爲我想要的類型?

+0

你的意思是你想將'sender'作爲'card'類型嗎?或者你想讓'sender'成爲你選擇的任何物體? – keyboardP

+0

我希望發件人是甲板[r [i,j]]類型。卡片是一張圖片,但是卡片[r [i,j]]包含了兩個我需要在事件處理程序中使用的整數。 – user2623966

回答

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分配事件處理程序。我的解決方案有點難以閱讀,但解決了這一問題。

最後,哪種解決方案更好取決於您的口味和需求。

+0

使用「標籤」屬性+1,好主意! – keyboardP

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 
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(無論你想文本框或東西)

+0

我收到InvalidCastException – user2623966

+1

@ user2623966 - 您無法將'sender'強制轉換爲任何類型。它將是'Image'類型,因爲你的'card'屬性存儲了一個圖像,這就是觸發'ManipulationCompleted'事件。 – keyboardP

+0

由於keyboardP提到你應該將它轉換爲實際的發送者而不是任何隨機類型。當您嘗試在之前的處理程序中投射時,這甚至會失敗。 –

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). 
} 
相關問題