WPF笔记

1、使用TypeConvert类将XAML标签的Attribute与对象的Propety进行映射

由于XAML所有属性=属性值,其中属性值必须是字符串,当属性值不是字符串时需要添加将该属性值转换成字符串的转换器,如下Human类child的Human类情况

 
[TypeConverter(typeof(StringToHumanTypeConverter))]public class Human{public string Name { get; set; }public Human Child { get; set; }}public class StringToHumanTypeConverter : TypeConverter{public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { Human h = new Human(); h.Name = value as string; return h; } return base.ConvertFrom(context, culture, value); } }

2、x:Attribute

①x:Class

告诉编译器xaml标签的编译结果与后台代码中指定的类合并

②x:ClassModifier

由标签生成的类的访问控制级别,如internal,public,private

③x:FieldModifier

标签的访问控制级别,如

④x:Share

 3、布局

主要布局控件有:Grid,StackPanel,Cavas DockPanel,WrapPanel

4、Binding对数据的校验

"WPF.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:Entity="clr-namespace:Entity;assembly=Entity"Title="MainWindow" Height="350" Width="525">"textbox1" Margin="5"/>"slider1" Minimum="0" Maximum="100" Margin="5"/>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;namespace WPF
{/// /// Interaction logic for MainWindow.xaml/// public partial class MainWindow : Window{public MainWindow(){InitializeComponent();Binding binding = new Binding("Value") {Source=this.slider1 };binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;RangeValidationRule rvr = new RangeValidationRule();rvr.ValidatesOnTargetUpdated = true;//设置Source出错时也校验,Binding只有在Target被外部方法改变时才校验binding.ValidationRules.Add(rvr);//添加校验binding.NotifyOnValidationError = true;//设置校验失败时Binding发出一个信号this.textbox1.SetBinding(TextBox.TextProperty, binding);this.textbox1.AddHandler(Validation.ErrorEvent,new RoutedEventHandler(this.ValidationErro));//添加侦听校验处理事件
        }//侦听校验处理事件private void ValidationErro(object sender, RoutedEventArgs e){if(Validation.GetErrors(this.textbox1).Count>0){this.textbox1.ToolTip = Validation.GetErrors(this.textbox1)[0].ErrorContent.ToString();}}}/// /// 校验类/// public class RangeValidationRule : ValidationRule{public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo){double d = 0;if(double.TryParse(value.ToString(),out d)){if(d>0&&d<100){return new ValidationResult(true, null);}}return new ValidationResult(false, "validation fail");}}
}

5、Binding对数据的转换

 当Source里的数据是X,Y,N时,UI上对应的是CheckBox控件的IsChecked属性值时此时我们需要手动写一个Converter类(称为数据转换器)来转换,方法是创建一个类并让这个类实现IValueConverter接口。此时当数据从Binding的Source流向target时,Convert方法被调用,反之ConvertBack方法被调用

using System;namespace WPF.Entity
{class Plane{public Category Category { get; set; }public State State { get; set; }public string Name { get; set; }}public enum Category{Bomber,Figher}public enum State{Available,Locked,Unknown}
}using System;
using System.Windows.Data;
namespace WPF.Entity
{/// /// Category数据转换器/// public class CategoryToSourceConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){Category c = (Category)value;switch (c){case Category.Bomber:return @"\Icons\Bomber.jpg";case Category.Figher:return @"\Icons\Fligter.jpg";default:return null;}}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}}/// /// State数据转换器/// public class StateToNullableBool:IValueConverter{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){State s = (State)value;switch (s){case State.Available:return true;case State.Locked:return false;case State.Unknown:default:return null;}}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){bool? b = (bool?)value;switch (b){case true:return State.Available;case false:return State.Locked;case null:default:return State.Unknown;}}}
}

 

"WPF.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:LocalEntity="clr-namespace:WPF.Entity"Title="MainWindow" Height="350" Width="800">"cts"/>"stab"/>"listboxPlane" Height="160" Margin="5">"20" Height="20" Source="{Binding Path=Category,Converter={StaticResource cts}}"/>"{Binding Name}" Width="60" Margin="80,0"/>"True" IsChecked="{Binding Path=State,Converter={StaticResource stab}}"/>
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using WPF.Entity;
using System;namespace WPF
{/// /// Interaction logic for MainWindow.xaml/// public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}/// /// Load按钮事件/// /// /// private void btnLoad_Click(object sender, RoutedEventArgs e){List planeList = new List(){new Plane(){Category=Category.Bomber,Name="B-1",State=State.Unknown},new Plane(){Category=Category.Bomber,Name="B-2",State=State.Unknown},new Plane(){Category=Category.Figher,Name="F-22",State=State.Unknown},new Plane(){Category=Category.Figher,Name="F-Su47",State=State.Unknown},new Plane(){Category=Category.Bomber,Name="B-52",State=State.Unknown},new Plane(){Category=Category.Figher,Name="F-J10",State=State.Unknown},};this.listboxPlane.ItemsSource = planeList;}/// /// 保存按钮事件/// /// /// private void btnSave_Click(object sender, RoutedEventArgs e){StringBuilder sb = new StringBuilder();foreach (Plane p in listboxPlane.Items){sb.AppendLine(string.Format("Category={0},Name={1},State={2}",p.Category,p.Name,p.State));}string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"PlaneList.txt");File.WriteAllText(filePath,sb.ToString());}}
}

 

转载于:https://www.cnblogs.com/come-on-come-on/p/5392557.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部