C# 如何将点击事件添加到Hubble

C# 如何将点击事件添加到Hubble,c#,windows-phone-7,xaml,silverlight-toolkit,C#,Windows Phone 7,Xaml,Silverlight Toolkit,我从windows phone toolkit中实现了以下hubbile控件,除了从所选的tile中实现一个tap事件外,其他一切都正常工作。我不确定如何将特定互动程序的点击链接到代码隐藏中的事件处理程序(只需导航到项目中的新页面)。到目前为止,我掌握的情况如下: MainPage.xaml <ListBox Grid.Row="0" x:Name="tileList" toolkit:TiltEffect.IsTiltEnabled="True">

我从windows phone toolkit中实现了以下hubbile控件,除了从所选的tile中实现一个tap事件外,其他一切都正常工作。我不确定如何将特定互动程序的点击链接到代码隐藏中的事件处理程序(只需导航到项目中的新页面)。到目前为止,我掌握的情况如下:

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>
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
#区域中心
公共主页()
{
初始化组件();
createhubbiles();
}
#端区
私有void createhubbiles()
{
列表tileItems=新列表()
{
//将有至少2个不同的瓷砖链接到单独的页面
新建TileItem(){ImageUri=“/Images/shareStatusImage.jpg”,Title=“status”,/*Notification=“last shared link uri”,*/Message=“last shared status Message”,GroupTag=“TileGroup”,Tap=“shareStatus\u Tap”},
新建TileItem(){ImageUri=“/Images/shareLinkImage.jpg”,Title=“link”,/*Notification=“last shared status message”,*/message=“last shared link uri”,GroupTag=“TileGroup”,Tap=“shareLink\u Tap”}
};
this.tileList.ItemsSource=tileItems;
}
#区域导航
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
基地。导航到(e);
HubTileService.UnfreezeGroup(“TileGroup”);
}
受保护的覆盖无效OnNavigatedFrom(NavigationEventArgs e)
{
基于(e)的导航;
HubTileService.FriezeGroup(“TileGroup”);
}
#端区
#区域事件处理程序
私有void hubbile_Tap(对象发送方,System.Windows.Input.GestureEventArgs e)
{
//震动
if(设置.启用振动.值)
{
VibrationController.Default.Start(TimeSpan.From毫秒(40));
}
TileItem tap=发送方为TileItem;
string _tap=tap.tap.ToString();//此处发生NullReferenceException
开关(_抽头)
{
案例“shareStatus_Tap”:
this.NavigationService.Navigate(新Uri(“/Views/ShareStatusPage.xaml”,UriKind.Relative));
打破
案例“shareLink_Tap”:
this.NavigationService.Navigate(新Uri(“/Views/ShareLinkPage.xaml”,UriKind.Relative));
打破
}
}
#端区

因此,我尝试为每个磁贴创建一个tap属性,然后当一个磁贴被点击时,事件处理程序决定哪个磁贴是被点击的,并相应地导航到一个新页面。但是由于某种原因,
Tap
属性为空?项目在模拟器中加载,但平铺点击不起作用,在我的实际设备上,应用程序根本不加载?

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

将tap事件处理程序更改为以下内容以正确实现:

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

您将获得一个NullReferenceException,可能是因为未设置TileItem实例的Tap属性。相反,您要设置的是hubbile控件中的点击事件的处理程序

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

  • 您应该添加NavigationUri属性,而不是TileItem上的Tap属性
  • 在hubbile的Tap事件的事件处理程序中,您可以使用NavigationUri直接导航到相应的视图,而不是检查哪个tile被点击
  • 下面是它的工作原理:

    public class TileItem
    {
        // previous properties (except Tap, as you don't need it)
        ...
    
        public string NavigationUri {get; set;}
    }
    
    对于每个TileItem,为其指定相应的导航URI

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

    希望这有帮助:)

    我已将解决方案更新为当前的解决方案,但我的事件处理程序中出现了NullReferenceException?
    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));
    }