【问题标题】:How to add tap event to HubTile如何将点击事件添加到 HubTile
【发布时间】:2012-08-13 23:42:53
【问题描述】:

我从 windows phone 工具包中实现了 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 属性为空吗?项目在模拟器中加载,但瓷砖点击不起作用,在我的实际设备上,应用程序根本没有加载?

【问题讨论】:

    标签: c# windows-phone-7 xaml silverlight-toolkit


    【解决方案1】:

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

    【讨论】:

    • 我已将我的解决方案更新为我目前拥有的解决方案,但我的事件处理程序中出现 NullReferenceException?
    【解决方案2】:

    将点击事件处理程序更改为以下以正确实现:

    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;
            }
        }
    

    【讨论】:

      【解决方案3】:

      您收到 NullReferenceException 可能是因为您的 TileItem 实例的 Tap 属性未设置。相反,您设置的是 HubTile 控件中 Tap 事件的处理程序。

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

      1. 您应该添加 NavigationUri 属性,而不是 TileItem 上的 Tap 属性。
      2. HubTileTap 事件的事件处理程序中,您可以使用 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
                           };
      

      而简化的 Tap 事件处理程序变为:

      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));
      }
      

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 2013-02-11
        • 2022-01-06
        • 1970-01-01
        • 2013-04-10
        • 2014-04-22
        • 2010-12-09
        • 2012-04-03
        相关资源
        最近更新 更多