2012-08-14 93 views
0

我從windows phone工具包中具有以下HubTile控件實現,並且除了從選定的圖塊實現點擊事件外,所有內容都正常工作。我不確定如何將特定磁貼的tap連接到代碼後面的Tap事件處理程序(它應該簡單地導航到我的項目中的新頁面)。我至今如下:如何將點擊事件添加到多個HubTiles

MainPage.xaml中

<ListBox Grid.Row="0" x:Name="tileList" toolkit:TiltEffect.IsTiltEnabled="True"> 
       <ListBox.ItemsPanel> 
        <ItemsPanelTemplate> 
         <toolkit:WrapPanel Orientation="Horizontal" /> 
        </ItemsPanelTemplate> 
       </ListBox.ItemsPanel> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <toolkit:HubTile Title="{Binding Title}" Margin="3" 
             Notification="{Binding Notification}" 
             DisplayNotification="{Binding DisplayNotification}" 
             Message="{Binding Message}" 
             GroupTag="{Binding GroupTag}" 
             Source="{Binding ImageUri}" 
             Tap="hubTile_Tap"> 
         </toolkit:HubTile> 

        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

TileItem.cs

public class TileItem 
{ 
    public string ImageUri 
    { 
     get; 
     set; 
    } 

    public string Title 
    { 
     get; 
     set; 
    } 

    public string Notification 
    { 
     get; 
     set; 
    } 

    public bool DisplayNotification 
    { 
     get 
     { 
      return !string.IsNullOrEmpty(this.Notification); 
     } 
    } 

    public string Message 
    { 
     get; 
     set; 
    } 

    public string GroupTag 
    { 
     get; 
     set; 
    } 

    //not sure how to implement this? 
    public string Tap 
    { 
     get; 
     set; 
    } 
} 

MainPage.xaml.cs中

#region Ctr 

    public MainPage() 
    { 
     InitializeComponent(); 

     CreateHubTiles(); 
    } 

    #endregion 

    private void CreateHubTiles() 
    { 
     List<TileItem> tileItems = new List<TileItem>() 
     { 
      //there will be at least 2 distinct tiles linking to seperate pages 
      new TileItem() { ImageUri = "/Images/shareStatusImage.jpg", Title = "status", /*Notification = "last shared link uri",*/ Message = "last shared status message", GroupTag = "TileGroup", Tap = "shareStatus_Tap" }, 
      new TileItem() { ImageUri = "/Images/shareLinkImage.jpg", Title = "link", /*Notification = "last shared status message",*/ Message = "last shared link uri", GroupTag = "TileGroup", Tap = "shareLink_Tap" } 
     }; 

     this.tileList.ItemsSource = tileItems; 
    } 

    #region Navigation 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 

     HubTileService.UnfreezeGroup("TileGroup"); 
    } 

    protected override void OnNavigatedFrom(NavigationEventArgs e) 
    { 
     base.OnNavigatedFrom(e); 

     HubTileService.FreezeGroup("TileGroup"); 
    } 

    #endregion 

    #region Event Handlers 

    private void hubTile_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     TileItem tap = sender as TileItem; 
     string _tap = tap.Tap.ToString(); //NullReferenceException occurs here 

     switch(_tap) 
     { 
      case "shareStatus_Tap": 
       this.NavigationService.Navigate(new Uri("/Views/ShareStatusPage.xaml", UriKind.Relative)); 
       break; 
      case "shareLink_Tap": 
       this.NavigationService.Navigate(new Uri("/Views/ShareLinkPage.xaml", UriKind.Relative)); 
       break; 
     } 
    } 
    #endregion 

在模擬器中的MainPage加載活動hubs工作,但tap事件會導致NullReferenceException,而在我的實際設備上,應用程序會這樣做一點都不加載?

回答

2

把你的斷點放在hubTile_Tap,看看sender是什麼。我猜這將是HubTile,而不是TileItem。在這種情況下,TileItem大概是HubTile.DataContext

0

我只是寫@JohnGardner相同,所以我會跳過。只要小心發件人。實際上在某些情況下,它可能是任何事情。如果您遇到這種情況,請嘗試檢查System.Windows.Input.GestureEventArgs e及其SourceOriginalSource - 它們可能不一定是HubTile,並且沒有必要具有有趣的DataContext,但幾乎可以確保它們是VisualUIElement,並且您可以輕鬆地追蹤它們VisualParents向上,並且一個關閉的可視化父母將是您的DataContext = TileItem的HubTile。這是最糟糕的情況。起初,嘗試約翰說,你有95%,它會工作:)

+0

這就是爲什麼我建議把斷點,以確保。是的,你可以得到一些奇怪的情況下,特別是取決於模板內的東西有多複雜...... – 2012-08-14 20:13:00

相關問題