在Windows Phone 8中更新图像控件

时间:2014-11-20 20:33:17

标签: image-processing windows-phone-8.1

我有一个HTML5网络应用程序,我可以通过我的移动设备查看。

我有一个img控件,可以使用ashx asp.net处理程序下载图像。

我通过计时器更新。

我正在尝试将其移植到Windows Phone 8.1应用程序中。

图像似乎需要很长时间才能更新(如果有的话)。这是我的代码:

long tick = DateTime.Now.Ticks;
BitmapImage bmp =new  BitmapImage(new Uri("http://my url/Mobile/NewFrame.ashx?b=1a=9A5C3-E1945-3D315-BB43C&c=3&m=1&t=" + tick));
imgFrame1.Source = bmp;

这是正确的方法吗?

这是完整的代码:

    private async void LogIn()
    {
        using (var client = new HttpClient())
        {
            var resp = await client.PostAsJsonAsync("http://my url/UserManagement/Login.aspx/Test",
                                                     new { username = "", password = "", hubuserid = hubuserid });

            var str = await resp.Content.ReadAsStringAsync();
            var jsonObj = JsonConvert.DeserializeObject<UserLogIn>(str);
            if (jsonObj.d.Success)
            {
                UpdateConnectionState("Logged In");
            }
            else
            {
                UpdateConnectionState("Not Logged In");
            }
        }
    }
    public class D
    {
        public string __type { get; set; }
        public bool Success { get; set; }
    }
    public class UserLogIn
    {
        public D d { get; set; }
    }

    private string hubuserid = "";
    public string Uptime { get; set; }
    private byte ImageIsLoaded = 1;

    private async void UpdateTime(int data)
    {
        await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            try
            {
                txtInfo.Text = data.ToString();
                if (ImageIsLoaded == 1)
                {
                    ImageIsLoaded = 0;
                    long tick = DateTime.Now.Ticks;

                    BitmapImage bi = new BitmapImage(new Uri("http://www.informedmotion.co.uk/Mobile/NewFrame.ashx?b=1a=9A5C3-E1945-3D315-BB43C&c=3&m=1&t=" + tick, UriKind.Absolute));
                    bi.DownloadProgress += bi_DownloadProgress;
                    bi.ImageOpened += bi_ImageOpened;                    }
            }
            catch (Exception ex)
            {
                txtInfo.Text = ex.ToString();
            }

        });
    }
    void bi_DownloadProgress(object sender, DownloadProgressEventArgs e)
    {
        //throw new NotImplementedException();

    }

    void bi_ImageOpened(object sender, RoutedEventArgs e)
    {
        ImageIsLoaded = 1;
        imgFrame1.Source = (BitmapImage)sender;
    }
    private void imgFrame1_ImageOpened(object sender, RoutedEventArgs e)
    {
        ImageIsLoaded = 1;   
    }

    private void imgFrame1_ImageFailed(object sender, ExceptionRoutedEventArgs e)
    {
        ImageIsLoaded = 1;   
    }
    public MainPage()
    {
        this.InitializeComponent();
        this.NavigationCacheMode = NavigationCacheMode.Required;
        imgFrame1.ImageFailed += imgFrame1_ImageFailed;
        imgFrame1.ImageOpened += imgFrame1_ImageOpened;
        ConnectToHub();
    }

    private void ConnectToHub()
    {
        proxy.On<int>("broadcastMessage", data =>
        {
            UpdateTime(data);
        });

        connection.Start().ContinueWith(task =>
        {
            if (task.IsFaulted)
            {
                UpdateConnectionState("Not Connected");
                ConnectToHub();
            }
            else
            {
                UpdateConnectionState(string.Format("Success! Connected with client connection id {0}", connection.ConnectionId));
                hubuserid = connection.ConnectionId;
                LogIn();
            }
        });


        connection.Error += ex =>
        {
            UpdateConnectionState(string.Format("An error occurred {0}", ex.Message));
        };
        connection.Closed += () =>
        {
            UpdateConnectionState(string.Format("Connection with client id {0} closed", connection.ConnectionId));
            ConnectToHub();
        };
        connection.Reconnected += () =>
        {
            //LogIn();
            UpdateConnectionState("The connection was re-established");
        };
    }


    Windows.UI.Core.CoreDispatcher dispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
    async void UpdateConnectionState(string state)
    {
        await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            try{
            txtInfo.Text = state;
            }
            catch (Exception ex)
            {
                txtInfo.Text = ex.ToString();
            }
        });
    }

    static HubConnection connection = new HubConnection("http://www.informedmotion.co.uk/");
    IHubProxy proxy = connection.CreateHubProxy("ChatHub");

1 个答案:

答案 0 :(得分:1)

如果您要下载图片,那么您可能想要挂钩

Image.DownloadProgress event
Image.ImageOpened event
下载完成后,

ImageOpened将会触发,因此您可以在此时设置.Source

正在下载(如果它是一张巨大的图片),您可以显示上一张图片或占位符图片(可能会显示进度条?)


BitmapImage bi = new BitmapImage(new Uri("http://www.google.com/myimage.bmp", UriKind.Absolute));
bi.DownloadProgress += bi_DownloadProgress;
bi.ImageOpened += bi_ImageOpened;

hiddenImage.Source = bi;    // we need to set it to an element in the visual tree so the
                            // events will fire, we're going to use the hiddenImage

void bi_DownloadProgress(object sender, DownloadProgressEventArgs e)
{
    throw new NotImplementedException();
}

void bi_ImageOpened(object sender, RoutedEventArgs e)
{
    throw new NotImplementedException();
}

<!-- myImage is your image that you use to show stuff -->
<!-- hiddenImage is the image we use to fire the event -->
<Image x:Name="myImage"></Image>
<Image x:Name="hiddenImage" Visibility="Collapsed"></Image>