UWP&WP8.1 附加属性 和WebView的NavigateToString方法XAML绑定方法
附加属性,即为添加一个没有的属性的。
使用方法和依赖属性相似,个人理解就是特殊形式的依赖属性。
经常的用处,以一个简单的来说,比如一个控件的某一个属性我们想在XAML中给其绑定数据。但是我们在XAML中确实无论如何都找不到这个属性。而在后台代码确实可以使用的。那么我们就要来给它加上一个附加属性了。
OK,我们说一下附加属性的编写的方法。 刚才说附加属性是依赖属性的一种形式。但是编写方式却不同于依赖属性需要两个SET,GET访问器进行封装。只需要写两个静态公共方法来对附加属性进行读写。
下面是两个方法的编写方式
读取: public static <返回类型>Getxx[xx是附加属性的名称](目标类型)
赋值:public static void Setxx[xx是附加属性的名称](目标类型,属性值)
示例代码
//读取的是需要返回值的,括号内基本就是附加对象 public static string GetHtmlString(DependencyObject D) //赋值不需要返回值,括号内参数需要两个一个附加对象,一个添加的值 public static void SetHtmlString(DependencyObject D, string HtmlString)
说完如何添加读取值,之外就是如何注册附加属性了。
注册附加属性是需要三个修饰符, public static readonly,必须是这三个。 然后是附加对属性。之后使用附加属性的RegisterAttached方法进行注册。
附加属性的RegisterAttached内需要四个参数。
分别是:name, propertyType, ownerType, defaultMetadata
下表为解释
名字 | 解释 |
name | 要注册的依赖项对象的名称。 |
propertyType | 该属性的类型,作为类型参考 |
ownerType | 正在注册依赖项属性的所有者类型,作为类型参考 |
defaultMetadata | 属性元数据实例。这可以包含一个 PropertyChangedCallback 实现引用。 |
下面给出注册的代码
//注册一个名为setHtmlString的附加属性,利用其.RegisterAttached方法,括号内参数分别是,要添加的属性,属性的类型,属性的所有者,以及元数据实例,且其中包含返回 public static readonly DependencyProperty setHtmlString = DependencyProperty.RegisterAttached("HtmlString", typeof(string), typeof(MainPage), new PropertyMetadata(null, CallBack)); //自动注册名为CallBack 的方法, private static void CallBack(DependencyObject d, DependencyPropertyChangedEventArgs e) { throw new NotImplementedException(); }
我们刚才说XAML进行绑定的时候会用到附加属性,使用的方式是 local:,这样VS就会自动出现了。
代码
到目前为止,一个简单的附加属性就可以了。但是可能是看不明白吧,所以我们要拿例子讲话。
实例:
WebView中有一个NavigateToString方法,可以加载本地的HTML字符串。我们想在前台进行绑定。但是并没有发现这个方法。所以我们要给其附加属性。
一般我们使用附加属性的时候需要新建一个类,也可以指在资源管理器中新建一个类进行编写附加属性,也可以在MainPage页面直接进行编写,但是要写在一个NameSpace。不要直接写在 MainPage()的方法内,不然啊会找不到的。不要为问什么。不信你可以试试,也可以在MainPage页面的MainPage()方法外写一个类进行编写附加属性,方法多多,随意。但那要表现出自己高大上的感觉可以新建一个类的页面进行编写附加属性,不仅是高大上也是为了方便阅读以及后续的更改。
下面就直接放出代码,例子是写在新建的类的页面,请注意
class GetWebHtml { //注册一个附加属性,括号内的参数,分别是 要添加的附加属性的名字,附加属性的类型,附加属性的所有者,附加属性的元数据,并且创建一个返回 public static readonly DependencyProperty setHtmlString =DependencyProperty.RegisterAttached ( "HtmlString", typeof(string), typeof(GetWebHtml), new PropertyMetadata(null, CallBack) ); //这里对你要控件的操作 private static void CallBack(DependencyObject d, DependencyPropertyChangedEventArgs e) { //将附加对象进行强制转换 WebView setData = d as WebView; //添加值 setData.NavigateToString(e.NewValue.ToString()); } //读取静态方法 public static string GetHtmlString(DependencyObject D) { return (string)D.GetValue(setHtmlString); } // 赋值静态方法 public static void SetHtmlString(DependencyObject D, string HtmlString) { D.SetValue(setHtmlString, HtmlString); } }
XAML页面
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<WebView local:GetWebHtml.HtmlString="{Binding T}" x:Name="_webview" />
</ScrollViewer> </Grid>
MainPage页面
public sealed partial class MainPage : Page { public class Data { public string T { get; set; } } public MainPage() { this.InitializeComponent(); Data _data = new Data(); string data ="<img src=\"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1487774858602&di=bc76e28a0328dd7a4412c28ac96c844d&imgtype=0&src=http%3A%2F%2Fi-7.vcimg.com%2Fcrop%2F32eb472901ee07279ce5cbf8810ea493467409%2528600x%2529%2Fthumb.jpg\"/>"; _data.T = data; this.DataContext = _data; } }
效果图