自定义实时磁贴更新问题

时间:2012-04-12 21:40:57

标签: xaml windows-phone-7.1

我正在开发Windows手机的天气应用程序。我想要利用的功能之一是实时图块。我有一个后台代理,当用户将城市固定到起始页面时运行。 在固定之后,它会拨打互联网电话以获取一些天气数据。所有这些都很好。

现在出现问题。 根据返回的天气数据,我想更新固定到开始屏幕的图块。 我有许多不同的.xaml文件(雨,雪,太阳等)代表每个瓷砖。 我的第一个想法是,我会:

  1. 在每个图块(CityState和Temp)上公开2个属性
  2. 在创建切片后设置这两个属性。
  3. 将该磁贴保存为IsolatedStorage,然后将其用于更新启动屏幕上的磁贴。
  4. 以下是我必须执行的代码:

        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数据。 我错过了什么?

1 个答案:

答案 0 :(得分:0)

我在这里看到的主要问题是,您是在尝试实际加载控件之前渲染图像。

尝试在Control.Loaded事件中处理渲染。

相关问题