当前位置: 首页 > 工具软件 > Webimage > 使用案例 >

分享一个网络图片控件(WebImage for wp8)

赫连宏伯
2023-12-01

  闲话不多说,直接上代码!!!转载请附上原作者地址哦!!!thx!!!

  WebImage.xaml页面代码如下:

 

<UserControl x:Class="WpDemo.Controls.WebImage"
      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"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="480" d:DesignWidth="480">

    <Grid x:Name="LayoutRoot">
        <Image x:Name="ImgShow" Stretch="UniformToFill" Visibility="Collapsed"/>
        <Grid x:Name="gdWait">
            <Rectangle x:Name="rectProgress" Fill="#FFFFB3E0" Stroke="Black" VerticalAlignment="Bottom"/>
            <TextBlock x:Name="tbProgress" HorizontalAlignment="Center" TextWrapping="Wrap" VerticalAlignment="Center" Foreground="White" Text="0"/>
        </Grid>
    </Grid>
</UserControl>
WebImage.xaml.cs类如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.IO;

namespace WpDemo.Controls
{
    public partial class WebImage : UserControl
    {
        private static String CacheFolder = "cloud_cache_image";
        private BitmapImage _imgSource = null;

        public static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(ImageSource), typeof(WebImage), null);
        public static readonly DependencyProperty StretchProperty = DependencyProperty.Register("Stretch", typeof(Stretch), typeof(WebImage), new PropertyMetadata(Stretch.UniformToFill));
        public static readonly DependencyProperty ImgUriProperty = DependencyProperty.Register("ImgUri", typeof(string), typeof(WebImage), new PropertyMetadata("", OnImgUriChanged));


        private string _ImgUri;

        public ImageSource Source
        {
            get { return ImgShow.Source; }
            set { ImgShow.SetValue(Image.SourceProperty, value); }
        }

        public Stretch Stretch
        {
            get { return ImgShow.Stretch; }
            set { ImgShow.SetValue(Image.StretchProperty, value); }
        }

        public string ImgUri
        {
            get
            {
                return _ImgUri;
            }
            set
            {
                _ImgUri = value;
                SetImgSource(_ImgUri);
            }
        }

        void SetImgSource(string uri)
        {
            string cacheName = Path.Combine(CacheFolder, ParseUri(uri));
            _imgSource = new BitmapImage();
            _imgSource.ImageOpened += imgSource_ImageOpened;
            if (IsolatedStorageFileHelper.FileExists(cacheName))
            {
                using (Stream stream = IsolatedStorageFileHelper.OpenFile(cacheName))
                {
                    _imgSource.SetSource(stream); ;
                }
                ImgShow.Visibility = System.Windows.Visibility.Visible;
                gdWait.Visibility = System.Windows.Visibility.Collapsed;
            }
            else
            {
                _imgSource.DownloadProgress += imgSource_DownloadProgress;
                _imgSource.ImageFailed += imgSource_ImageFailed;
                _imgSource.UriSource = new Uri(uri, UriKind.Absolute);
            }
            ImgShow.Source = _imgSource;
        }

        void imgSource_ImageFailed(object sender, ExceptionRoutedEventArgs e)
        {
            _imgSource.ImageOpened -= imgSource_ImageOpened;
            _imgSource.ImageFailed -= imgSource_ImageFailed;
            _imgSource.DownloadProgress -= imgSource_DownloadProgress;
        }

        void imgSource_ImageOpened(object sender, RoutedEventArgs e)
        {
            ImgShow.Visibility = System.Windows.Visibility.Visible;
            gdWait.Visibility = System.Windows.Visibility.Collapsed;
            BitmapImage img = (BitmapImage)sender;
            WriteableBitmap wb = new WriteableBitmap(img);
            using (Stream stream = IsolatedStorageFileHelper.CreateFile(Path.Combine(CacheFolder, ParseUri(img.UriSource.AbsoluteUri))))
            {
                wb.SaveJpeg(stream, img.PixelWidth, img.PixelHeight, 0, 100);
            }
            _imgSource.ImageOpened -= imgSource_ImageOpened;
            _imgSource.ImageFailed -= imgSource_ImageFailed;
            _imgSource.DownloadProgress -= imgSource_DownloadProgress;
        }

        void imgSource_DownloadProgress(object sender, DownloadProgressEventArgs e)
        {
            rectProgress.Height = gdWait.ActualHeight * (e.Progress / 100.0);
            tbProgress.Text = e.Progress.ToString();
            _imgSource.DownloadProgress -= imgSource_DownloadProgress;
        }

        public WebImage()
        {
            InitializeComponent();
        }

        private static void OnImgUriChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            WebImage img = obj as WebImage;
            img.ImgUri = e.NewValue as string;
        }

        private string ParseUri(string uri)
        {
            return uri.Replace("://", "").Replace("/", "_");
        }
    }
}

using System;
using System.Collections.Generic;
using System.IO.IsolatedStorage;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace WpDemo.Common
{
    public class IsolatedStorageFileHelper
    {
        private static IsolatedStorageFile _Store = null;
        private static IsolatedStorageFile Store
        {
            get
            {
                if (_Store == null)
                {
                    _Store = IsolatedStorageFile.GetUserStoreForApplication();
                }
                return _Store;
            }
        }
        public static void CreateFolder(string dir)
        {
            if (Store.DirectoryExists(dir))
                return;
            Store.CreateDirectory(dir);
        }
        public static void DeleteFolder(string dir)
        {
            if (Store.DirectoryExists(dir))
                return;
            Store.DeleteDirectory(dir);
        }

        public static void DeleteFile(string path)
        {
            if (!Store.FileExists(path))
                return;
            Store.DeleteFile(path);
        }

        public static IsolatedStorageFileStream CreateFile(string path)
        {
            string[] parts = path.Split('\\');
            string dir = "";
            for (int i = 0; i < parts.Length - 1; i++)
            {
                string part = parts[i];
                dir = System.IO.Path.Combine(dir, part);
                if (!Store.DirectoryExists(dir))
                    Store.CreateDirectory(dir);
            }
            return Store.CreateFile(path);
        }

        public static bool FileExists(string path)
        {
            return Store.FileExists(path);
        }

        public static IsolatedStorageFileStream OpenFile(string path)
        {
            return Store.OpenFile(path, System.IO.FileMode.Open);
        }

        public static void SerializeObject(object obj, string path)
        {
            if (Store.FileExists(path))
                Store.DeleteFile(path);
            XmlSerializer xml = new XmlSerializer(obj.GetType());
            using (var stream = CreateFile(path))
            {
                xml.Serialize(stream, obj);
            }
        }

        public static T DeSerializeObject<T>(string path)
        {
            if (!Store.FileExists(path))
                return default(T);
            XmlSerializer xml = new XmlSerializer(typeof(T));
            object obj = null;
            using (var stream = OpenFile(path))
            {
                obj = xml.Deserialize(stream);
            }
            return (T)obj;
        }
    }
}

用法如下:

xmlns:MyControl="clr-namespace:CloudWpDemo.Controls"
<StackPanel Grid.Column="0" Width="200">
                                <MyControl:WebImage ImgUri="{Binding Img_url}" Margin="5,5,5,5"></MyControl:WebImage>
                                <!--<Image Source="{Binding Img_url}"></Image>
                                <TextBlock Text="{Binding Name}"></TextBlock>-->
                            </StackPanel>

 我测试过蛮多次。。。。此控件挺好用的!!!希望对你的开发有用!!!!

 类似资料: