2012-08-13 49 views
1

我从windows phone工具包中具有以下HubTile控件的实现,并且除了从选定的图块实现点击事件外,一切都正常工作。我不确定如何将特定图块的tap连接到代码后面的事件处理程序(它应该简单地导航到我的项目中的新页面)。我至今如下:如何将点击事件添加到HubTile

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) 
    { 
     //vibrate 
     if (Settings.EnableVibration.Value) 
     { 
      VibrateController.Default.Start(TimeSpan.FromMilliseconds(40)); 
     } 

     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 

所以我试图为每个图块创建一个tap属性,然后当点击一个图块时,事件处理程序决定哪个图块是被点击的图块并导航到相应的新页面。由于某些原因,Tap属性为空,但?该项目在模拟器中加载,但无法启动磁贴,并且在我的实际设备上,应用程序根本无法加载?

回答

1

您不需要在xaml中绑定tap属性,而是创建一个tap处理程序并将该处理程序的名称提供给tap属性。

+0

我有我的解决方案更新到我目前有,但我得到的在我的事件处理程序中的NullReferenceException? – Matthew 2012-08-14 17:42:43

1

改变抽头事件处理程序,为正确执行以下操作:因为,也许,你的TileItem实例点击属性未设置

private void hubTile_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     //vibrate 
     if (Settings.EnableVibration.Value) 
     { 
      VibrateController.Default.Start(TimeSpan.FromMilliseconds(40)); 
     } 

     //TileItem tap = sender as TileItem; 
     HubTile tap = sender as HubTile; 
     string _tap = tap.Title.ToString(); //NullReferenceException occurs here 

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

你得到的NullReferenceException 。您正在设置的是点按事件处理程序HubTile控件。

现在,为了得到你想要的行为,我建议如下:

  1. 而不是在TileItem一个点击财产,你应该添加一个NavigationUri财产。
  2. 在为自来水事件的的HubTile事件处理程序,而不是检查哪个瓦片被窃听,你可以直接导航到使用NavigationUri

下面是它如何工作的相应的视图:

public class TileItem 
{ 
    // previous properties (except Tap, as you don't need it) 
    ... 

    public string NavigationUri {get; set;} 
} 

每个TileItem,给它的相应NavigationUri

var shareStatusPage= new TileItem 
        { 
         Title="Share Status", 
         ImageUri="ShareStatus.png", 
         NavigationUri="/Views/ShareStatusPage.xaml", 
         //rest of properties 
        }; 
var shareLinkPage= new TileItem 
        { 
         Title="Share Link", 
         ImageUri="ShareLink.png", 
         NavigationUri="/Views/ShareLinkPage.xaml", 
         //rest of properties 
        }; 

与简易点击事件处理程序变为:

private void hubTile_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
{ 
    //vibrate 
    if (Settings.EnableVibration.Value) 
    { 
     VibrateController.Default.Start(TimeSpan.FromMilliseconds(40)); 
    } 

    TileItem item = sender as TileItem; 
    this.NavigationService.Navigate(new Uri(item.NavigationUri, UriKind.Relative)); 
} 

希望这有助于:)

相关问题