2012-04-12 16 views
1

私はWindows Phoneの天気アプリケーションに取り組んでいます。私が利用したい機能の1つはライブタイルです。私は、ユーザーがスタートページに都市をピン留めするときに実行されるバックグラウンドエージェントを持っています。 固定された後、天気データを取得するためにインターネットに電話をかけます。これらはすべてうまくいきます。カスタムライブタイル更新の問題

問題が発生しました。 返される天気データに応じて、開始画面に固定されているタイルを更新したいとします。 私は、各タイルを表すいくつかの異なる.xamlファイル(雨、雪、太陽など)を持っています。 私の最初の考えは、私はというものであった:

  1. は各タイル上の2つのプロパティ(シティステイトとTemp)に
  2. を公開タイルを作成した後に、これらの2つのプロパティを設定します。
  3. タイルをIsolatedStorageにイメージとして保存してから、開始画面のタイルを更新することができます。

ここで私はことをしなければならないコードです:だから

var ctl = new Snow(); 
//just some dummy data to test 
    ctl.CityState = "Test, NY"; 
    ctl.Temp = 25; 
    ctl.Measure(new Size(173, 173)); 
    ctl.Arrange(new Rect(0, 0, 173, 173)); 
    var bmp = new WriteableBitmap(173, 173); 
    bmp.Render(ctl, null); 
    bmp.Invalidate(); 
    var iss =IsolatedStorageFile.GetUserStoreForApplication(); 
    var filename = "/Shared/ShellContent/tileTest.jpg"; 
    using (var stm = iss.CreateFile(filename)) 
    { 
    bmp.SaveJpeg(stm, 173, 173, 0, 80); 
    } 
    tile.BackgroundImage = new Uri("isostore:" + filename, UriKind.Absolute); 
    var tileToUpdate = ShellTile.ActiveTiles.FirstOrDefault(r => r.NavigationUri == uri); 
    tileToUpdate.Update(tile); 

を、これが実行されるとき、それはXAMLファイルから新しいタイルを作成し、スタート画面を更新しますが、温度やシティステイト性質が は新しいタイルには反映されません。 xamlにはコードビハインドのプロパティにバインドされた2つのテキストブロックがあります。私はまた を実装しましたINotifyPropertyChanged。 は、ここでは、正しいXAMLファイルをインスタンス化し、それをディスクに保存し、

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    x:Name="Window" 
    x:Class="ezweather.services.tiles.Snow" 
    d:DesignWidth="480" d:DesignHeight="800" Width="173" Height="173" > 

     <Canvas x:Name="Layer_1" Width="173" Height="173" Canvas.Left="0" Canvas.Top="0" > 
     <Rectangle x:Name="Rectangle" Width="173" Height="173" Canvas.Left="0" Canvas.Top="-1.52588e-005" Stretch="Fill" Fill="#FF3F6A8D"/> 
     <TextBlock x:Name="cityState" TextAlignment="Left" FontFamily="Segoe UI Semibold" FontWeight="Bold" FontSize="15" Width="Auto" Height="Auto" Canvas.Left="0" Canvas.Top="0"> 
      <TextBlock.RenderTransform> 
       <TransformGroup> 
        <MatrixTransform Matrix="1.33333,0,0,1.33333,11,139.5"/> 
       </TransformGroup> 
      </TextBlock.RenderTransform> 
      <Run Text="{Binding ElementName=Window, Path=CityState}" Foreground="#FFFFFFFF"/> 
     </TextBlock> 
     <TextBlock x:Name="temp" TextAlignment="Right" FontFamily="Segoe UI Light" FontSize="44" Width="Auto" Height="Auto" Canvas.Left="0" Canvas.Top="0"> 
      <TextBlock.RenderTransform> 
       <TransformGroup> 
        <MatrixTransform Matrix="1.33333,0,0,1.33333,87.57,42.9333"/> 
       </TransformGroup> 
      </TextBlock.RenderTransform> 
      <Run Text="{Binding ElementName=Window, Path=Temp}" Foreground="#FFFFFFFF"/> 
     </TextBlock> 
    </Canvas> 
</UserControl> 

XAML

であり、ここで、このコードが実行されると分離コード

public partial class Snow : UserControl, INotifyPropertyChanged 
    { 
     public Snow() 
     { 
      // Required to initialize variables 
      InitializeComponent(); 
     } 
     private string _cityState; 
     private int _temp; 
     public string CityState 
     { 
      get { return _cityState; } 
      set 
      { 
       _cityState = value; 
       RaisePropertyChanged("CityState"); 
      } 
     } 
     public int Temp 
     { 
      get { return _temp; } 
      set 
      { 
       _temp = value; 
       RaisePropertyChanged("Temp"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void RaisePropertyChanged(string property) 
     { 
      if(PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

です。 開始画面でタイルを更新しますが、CityStateとTempのデータは表示されません。

CityStateとTempのデータがイメージで書き出されない理由はわかりません。 私は何が欠けていますか?

答えて

0

私がここで見る主な問題は、コントロールが実際に読み込まれる前に画像をレンダリングしようとしているかどうかです。

Control.Loadedイベントでレンダリングを処理してみてください。