1

Windows電話ツールキットからの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プロパティはnullですか?プロジェクトはエミュレーターにロードされますが、タイルタップが機能せず、実際のデバイスではアプリがまったくロードされませんか?

4

3 に答える 3

1

おそらく、TileItemインスタンスのTapプロパティが設定されていないため、NullReferenceExceptionが発生しています。代わりに設定しているのは、 HubTileコントロールのTapイベントへのハンドラーです。

ここで、必要な動作を得るために、次のことをお勧めします。

  1. TileItemのTapプロパティの代わりに、 NavigationUriプロパティを追加する必要があります。
  2. HubTileのTapイベントのイベント ハンドラーでは、どのタイルがタップされたかを確認する代わりに、 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));
}

お役に立てれば :)

于 2012-08-14T18:23:29.317 に答える
1

xaml でタップ プロパティをバインドする必要はありません。代わりに、タップ ハンドラを作成し、ハンドラの名前をタップ プロパティに提供します。

于 2012-08-14T05:28:44.463 に答える
1

正しく実装するには、タップ イベント ハンドラーを次のように変更します。

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;
        }
    }
于 2012-08-14T18:08:29.640 に答える