如何在WPF窗口中显示下载的图像

时间:2010-09-25 15:35:30

标签: c# wpf wpf-controls

我需要通过http下载网络摄像头图像,然后以10fps刷新它并将其显示在WPF窗口中。现在我正在使用这段代码:

    Window1 wndMain;
    BitmapImage img;
    DispatcherTimer tmrRefresh;
    public WCam(Window1 wndMain, string imguri)
    {
        this.wndMain = wndMain;
        this.MouseLeftButtonDown += delegate { DragMove(); };
        url = imguri;
        InitializeComponent();
        tmrRefresh = new DispatcherTimer(TimeSpan.FromMilliseconds(100),
        DispatcherPriority.Normal, Refresh, Dispatcher.CurrentDispatcher);
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        if (url != "")
        {
            try
            {
                img = new BitmapImage();
                img.BeginInit();
                img.CacheOption = BitmapCacheOption.OnLoad;
                img.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                img.UriSource=(new Uri(url));
                img.EndInit();
            }
            catch (Exception ex)
            {
                new WPopup().Show(ex.Message);
            }
            ImgBox.Source = img;
            tmrRefresh.Start();
        }

    }
    public void Refresh(object sender, EventArgs e)
    {
        try
        {
            img = new BitmapImage();
            img.BeginInit();
            img.CacheOption = BitmapCacheOption.OnLoad;
            img.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            img.UriSource = (new Uri(url));
            img.EndInit();
        }
        catch (Exception ex)
        {
            new WPopup().Show(ex.Message);
        }
        ImgBox.Source = null;
        ImgBox.Source = img;
    }

它什么都不显示,如果我将定时器间隔增加到1000,它会显示图像但图像会在加载下一个图像时消失。窗户也非常缓慢地加载。

1 个答案:

答案 0 :(得分:0)

从图像中分离加载逻辑。 保持加载的代码不变,刷新应该使用简单的异步(保持ui运行)请求下载图像,并且仅在完成时将图像源更改为本地内存。