2

Windows Phoneアプリケーションを作成しました。カスタムタイルを作成し、プログラムから更新する必要があります。

ユーザーコントロールを作成しました。

 <TextBlock x:Name="Count" Foreground="White" FontFamily="Segoe WP Bold" FontSize="80" Text="{Binding Count}" HorizontalAlignment="Right" Margin="0,0,10,0"/>
 <TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="0,0,0,0" Grid.Row="1" Text="Tile Demo" Foreground="White" FontFamily="Segoe WP Semibold" FontSize="35" />

MainPage.xaml.csファイルからカウントをバインドしてから、ユーザーコントロールを.jpgファイルに変換し、ISOストアに保存しています。以下のように

 public void CreateOrUpdateTile(int count) 
 {
 CustomNotificationTile frontTile = new CustomNotificationTile();
 TileData tileData = new TileData() { Count = count };
 frontTile.DataContext = tileData;

 //frontTile.Count.Text = count.ToString();

 frontTile.Measure(new Size(173, 173));
 frontTile.Arrange(new Rect(0, 0, 173, 173));
 var bmp = new WriteableBitmap(173, 173);
 bmp.Render(frontTile, null);
 bmp.Invalidate();

 var isf = IsolatedStorageFile.GetUserStoreForApplication();
 var filename = "/Shared/ShellContent/Tile.jpg";

 if (!isf.DirectoryExists("/Shared/ShellContent"))
 {
        isf.CreateDirectory("/Shared/ShellContent");
 }

 using (var stream = isf.OpenFile(filename, System.IO.FileMode.OpenOrCreate))
 {
 bmp.SaveJpeg(stream, 173, 173, 0, 100);
 }


 ShellTile TileToFind = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("TileID=2"));

 //test if Tile was created
 if (TileToFind == null)
 {
       StandardTileData NewTileData = new StandardTileData
       {
             BackgroundImage = new Uri("isostore:" + filename, UriKind.Absolute),
             BackBackgroundImage = new Uri("Application_TileImage_173x173.png", UriKind.Relative)
       };

       ShellTile.Create(new Uri("/MainPage.xaml?TileID=2", UriKind.Relative), NewTileData);
       }

 #region Update the Tile Not Working as expected

        else
        {
            StandardTileData NewTileData = new StandardTileData
            {
                BackgroundImage = new Uri("isostore:" + filename, UriKind.Absolute)
            };
            TileToFind.Update(NewTileData);
        }

        #endregion
  }

問題:

私の問題は、最初にコンストラクターから呼び出して、ダミーデータを含むタイルを作成することです。期待どおりに機能します。

しかし、機能していない他のメソッドからタイルを更新しようとすると、page_loadイベントから呼び出しているメソッドが表示されます

これらのメソッドはWCFサービスからデータをフェッチします。私は、以下のようにWCFサービスメソッドの完了したイベントからタイルを更新しています。

Service.getProductsCountAsync();

Service.getProductsCountCompleted += (o,e) => { 
int count = e.Result;
Dispatcher.BeginInvoke(() =>
        {
            CreateOrUpdateTile(count);
        });
};

コントローラーが上記のコードをヒットすると、背景が黒の数字のみが表示され、タイルカウントは更新されますが、背景色とロゴが変更されます。理由はわかりませんが、できるだけ早く解決する必要があります。

問題はバックグラウンドスレッドからUIを更新することかもしれないと思いますが、それを克服する方法がわかりません

以下は、メソッド呼び出しの前とメソッド呼び出しの後に撮影される画像です。

更新する前に

サービスコール後

4

1 に答える 1

1

その働き

背景色をバインドする必要があります。ロゴも静的であるにもかかわらず、カウントのように動的にバインドする必要があります

その後、期待どおりに動作しています

于 2012-07-23T06:01:38.670 に答える