wpf/WP/C#/Sliverlight 自定义控件,绑定依赖属性

自定义控件,绑定依赖属性

有时候需要绑定一个自定义的依赖属性,比如你有个Image控件,如果在默认的属性Source赋值设置某个url如:http://f.hiphotos.baidu.com/image/h%3D360/sign=f7030d1d1a178a82d13c79a6c602737f/6c224f4a20a446237cd252b39c22720e0df3d7c3.jpg

的时候不见得能显示这个图片,因为百度有防盗链措施,其实就是判断了请求的来源是否为百度自己的网站服务器,解决方法就是http请求的header 里的"Referer"设置为"http://www.baidu.com"

//也可这样去请求
// HttpWebRequest re = (HttpWebRequest)WebRequest.Create("http://f.hiphotos.baidu.com/image/h%3D360/sign=f7030d1d1a178a82d13c79a6c602737f/6c224f4a20a446237cd252b39c22720e0df3d7c3.jpg");
// re.Headers["Referer"]= "http://www.baidu.com";

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage.Streams;
using System.Runtime.InteropServices.WindowsRuntime;

namespace wgscd_test
{
public class ImageEx:UserControl
{
public ImageEx()
{
img = new Image();
Content = img;

    }
    Image img;
    BitmapImage bmp;
    //注册依赖属性
    public static DependencyProperty UrlProperty = DependencyProperty.Register("Url",
                                       typeof(string),
                                       typeof(ImageEx),
                                       new PropertyMetadata("默认属性值", OnUrlPropertyChanged));

    //依赖属性对应的控件属性
    public string Url
    {
        get { return (string)GetValue(UrlProperty); }
        set { SetValue(UrlProperty, value); }
    }

    //依赖属性回掉函数(static)
    private static void OnUrlPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        //这里MySilverButton是控件类名
        var mySilverButton = d as ImageEx;
        if (mySilverButton != null)
        {
            mySilverButton.PropertyChangedMethodFun(e);
        }
    }

    bool loaded = false;
    //属性变化回掉(通过静态函数调用,也可以在静态函数里写)
    private async void PropertyChangedMethodFun(DependencyPropertyChangedEventArgs e)
    {
        // var bgTextBlock = GetTemplateChild("ButtonCaption") as TextBlock;
        //  if (bgTextBlock != null) bgTextBlock.Text = e.NewValue as string;
        if (e.NewValue != e.OldValue && ""+e.NewValue!="") {

            if (loaded) return;
            loaded = true;
          //  await System.Threading.Tasks.Task.Delay(5000);
            try {
                HttpClient client = new HttpClient();
                var bytes = await client.GetByteArrayAsync("" + e.NewValue);
                IBuffer buffer = WindowsRuntimeBufferExtensions.AsBuffer(bytes, 0, bytes.Length);
                //Ibuffer转IrandomAccessStream
                InMemoryRandomAccessStream inStream = new InMemoryRandomAccessStream();
                DataWriter datawriter = new DataWriter(inStream.GetOutputStreamAt(0));
                datawriter.WriteBuffer(buffer, 0, buffer.Length);
                await datawriter.StoreAsync();
                // bmp = new BitmapImage(new Uri(""+e.NewValue ,UriKind.Absolute ));
                // img.Source = bmp;
                bmp = new BitmapImage();
                bmp.SetSourceAsync(inStream);
                img.Source = bmp;
            }
            catch { }
        }

    }


}

}

这个自定义控件就可在设置 URL的时候自动去请求这个图片了!

例子里的HTTP请求可以改为你实际情况适合的方式 如 webclient ,HttpWebRequest 这种方式!

调用直接设置Url就是
如: 《UI:ImageEx Url ="{Binding url}" Width="222" Height="380"
注意 Url ="{Binding url} 就是绑定的图片地址数据

        ObservableCollection ObservableObj = new ObservableCollection<object>();
        ObservableObj.Add(new { url = "http://img1.mm131.com/pic/1918/1.jpg", Name = "帅1", Sex = "男", Age = 20 });
        ObservableObj.Add(new { url = "http://img1.mm131.com/pic/1918/2.jpg", Name = "帅2", Sex = "女", Age = 60 });
        ObservableObj.Add(new { url = "http://img1.mm131.com/pic/1918/3.jpg", Name = "帅3", Sex = "女", Age = 50 });
        ObservableObj.Add(new { url = "http://img1.mm131.com/pic/1918/4.jpg", Name = "帅4", Sex = "女", Age = 40 });
        ObservableObj.Add(new { url = "http://img1.mm131.com/pic/1918/5.jpg", Name = "帅5", Sex = "男", Age = 20 });
        list2.ItemsSource = ObservableObj;

转载于:https://www.cnblogs.com/wgscd/articles/5092016.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值