Windows Phone 7引脚用于从应用程序内部启动磁贴

时间:2012-12-21 16:46:10

标签: c# xml windows-phone-7

我为我的应用程序制作了大约100个Hubtiles,我希望他们在点击时读取XML文件,并且用户能够在应用程序外的屏幕上“固定”所需的Hubtile。

每个Hubtile都会读取不同的XML文件,并且必须能够固定以启动。

我知道要启动它的代码,我知道让它读取XML的代码,但是有100个磁贴,这将是许多编码和复制/粘贴行。

这是我的代码,可以从应用程序中弹出一个tile,并固定在xaml上开始:

<toolkit:HubTile Name="Monday" Title="Monday" Source="Days\Weekdays\Monday.png" Margin="15" Tap="day_Tap">
    <toolkit:ContextMenuService.ContextMenu>
        <toolkit:ContextMenu>
            <toolkit:MenuItem Name="monday" Header="pin to start" Tap="monday_Tap"/>
        </toolkit:ContextMenu>
    </toolkit:ContextMenuService.ContextMenu>
</toolkit:HubTile>

CS文件背后的代码,用于制作并检查它是否已存在:

private void monday_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    CreateLiveTile(Monday, "path-to-xml", "monday_Square_0.png");
}

private void CreateLiveTile(HubTile hubtile, string link, string id)
{
    StandardTileData LiveTile = new StandardTileData
    {
        Title = hubtile.Title,
        BackBackgroundImage = (hubtile.Source as BitmapImage).UriSource
    };
    ShellTile Tile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("id=" + id));
    {
        if (Tile == null)
        {
            ShellTile.Create(new Uri("/Show.xaml?id=" + id + "&link=" + link, UriKind.Relative), LiveTile);
        }
        else
        {
            MessageBox.Show("The tile is already pinned");
        }
    }
}

使用一个点击事件处理程序是否存在动态方式,或者我需要100个点击事件处理程序用于所有100个图块,每个XML文件需要100个路径,100个事件处理程序用于启动hubtile并编写在xaml的每个hubtile上都有相同的东西?

此外,我尝试并认为它有效,为所有的hubtile制作一个tap事件处理程序,但我看到了hubtile名称的整个路径,而不仅仅是tile名称:

private void Week_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    String a = (((Microsoft.Phone.Controls.HubTile)(sender)).Source as BitmapImage).UriSource.OriginalString;
    String b = a.Replace(((Microsoft.Phone.Controls.HubTile)(sender)).Title + "_Square_0.png", "week.xml");
    String weekPath = a.Replace(((Microsoft.Phone.Controls.HubTile)(sender)).Title + "_Square_0.png", "");
    String weekName = ((Microsoft.Phone.Controls.HubTile)(sender)).Title;     
    NavigationService.Navigate(new Uri("/Show.xaml?parameter=" + b, UriKind.Relative));
}

1 个答案:

答案 0 :(得分:7)

每个控件都有Tag属性。此属性的类型为object,已经为您设置 。基本上,你可以把你需要的任何信息放在里面。这对于实现通用操作是非常宝贵的帮助,就像您正在尝试的那样。

所以你可以这样做:

<toolkit:HubTile Name="Monday" Title="Monday" Source="Days\Weekdays\Monday.png" Margin="15" Tap="Tile_Tap" Tag="path-to-xml">

然后在事件处理程序中:

private void Tile_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    var pathToXml = (string)((FrameworkElement)sender).Tag;
    // Whatever
}