1

私はWindows Phone用の天気アプリケーションに取り組んでいます。活用したい機能の 1 つがライブ タイルです。ユーザーが都市をスタート ページに固定したときに実行されるバックグラウンド エージェントがあります。ピン留めされると、インターネットに呼び出しを行い、気象データを取得します。これはすべて正常に機能します。

さて、問題です。返された気象データに応じて、スタート画面に固定されているタイルを更新したいと考えています。各タイルを表すさまざまな .xaml ファイル (雨、雪、太陽など) があります。私が最初に考えたのは、次のようにすることでした。

  1. 各タイルに 2 つのプロパティ (CityState と 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 ファイルから新しいタイルが作成され、開始画面が更新されますが、Temp プロパティと CityState プロパティは新しいタイルに反映されません。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>

ここにコードビハインドがあります

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

このコードを実行すると、正しい xaml ファイルがインスタンス化され、ディスクに保存されます。その後、スタート画面のタイルを更新しますが、CityState と Temp のデータは表示されません。

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

4

1 に答える 1

0

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

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

于 2012-04-18T22:52:06.917 に答える