《C#入门经典v6》读书笔记2 Windows编程
2016-04-09 20:04
489 查看
第15章 基本桌面编程
GUI(Graphical User Interface,图形用户界面)XAML(Extensible Application Markup Language,可扩展应用程序标记语言,读作zammel)
alignment 对齐
margin 边距;外边距
padding 内边距;填充
stretch 拉伸
canvas 画布
TextBox获得焦点时全选文本:GotFocus+PreviewLeftMouseButtonDown事件,详见P427。
路由事件:详见P402
-冒泡事件(bobbling event),本身→父控件
-下钻事件(tunneling event),父控件→本身,Preview前缀,比对应冒泡事件优先触发
布局控件:
- | 绝对布局 | 相对布局 | 线性布局 | 表格布局 |
---|---|---|---|---|
WPF | Canvas | DockPanel | StackPanel | Grid |
android | RelativeLayout | LinearLayout | TableLayout |
数据绑定:绑定到本地对象;静态绑定到外部对象;动态绑定到外部对象(DataContent控件),详见P427。
INotifyPropertyChanged接口:向客户端发出某属性已更改的通知(动态绑定),详见P430。
public class GameOptions:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (PropertyChanged!=null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } private bool _playAgainstComputer = true; public bool PlayAgainstComputer { get { return _playAgainstComputer; } set { _playAgainstComputer = value; OnPropertyChanged("PlayAgainstComputer");//通知属性已更改 } } }
第16章 高级桌面编程
路由命令:CanExecute,Command,Executed,详见P443。using System.Windows.Input; //一个路由命令以及触发的手势(ctrl+N) public static RoutedCommand StartGameCommand = new RoutedCommand("Start New Game", typeof(GameViewModel), new InputGestureCollection(new List<InputGesture> { new KeyGesture(Key.N, ModifierKeys.Control) }));
Style样式,Template模板,Trigger触发器,Animation动画:用于自定义控件,详见P444。
值转换器:实现IValueConverter接口
用户控件:继承UserControl
依赖属性:P400介绍+P453实现+P476便捷输入。用户控件的属性值改变时可以触发一系列属性的联动改变以及界面外观的改变,可用诸多代码实现,但用依赖属性绑定属性后更为简单。
public static DependencyProperty SuitProperty = DependencyProperty.Register( "Suit",//依赖属性名 typeof(CardLib.Suit),//属性类型 typeof(CardControl),//属性所在类类型 new PropertyMetadata( CardLib.Suit.Club, //默认值 new PropertyChangedCallback(OnSuitChanged))//值改变时的回调方法(自定义) );
域模型(基本数据)、视图模型(跟界面表示相关的基本数据的组合)、MVVM模型-视图-视图模型,详见P462。
List的Any()和ForEach()用法,详见P471。
(LINQ结合Lambda表达式,详见P701)
//当List<Player>中有任意元素x满足x.State == PlayerState.Winner时,返回true bool hasWinner = Players.Any(x => x.State == PlayerState.Winner); if (!hasWinner) { //对List<Player>中每个元素x执行操作x.State = PlayerState.Inactive Players.ForEach(x => x.State = PlayerState.Inactive); }
Dispatcher发起多线程任务:
public void ThreadTask(CardsInHandControl control) { Thread delayedWorker = new Thread(control.DelayDraw);//定义线程需要执行的方法DelayDraw delayedWorker.Start(new Payload //定义DelayDraw方法需要的参数,并启动线程 { Deck = control.Game.GameDeck, AvailableCard = control.Game.CurrentAvailableCard, Player = computerPlayer }); } private void DelayDraw(object payload) { Thread.Sleep(1250); var data = payload as Payload;//获得参数 Dispatcher.Invoke( //Dispatcher用于发起调用,以保证调用是在GUI线程上发生的 DispatcherPriority.Normal, //线程优先级 new Action<Deck, Card>(data.Player.PerformDraw), //要执行的方法PerformDraw和参数类型<Deck, Card> data.Deck, data.AvailableCard //方法PerformDraw的参数 ); }
第17章 Windows Store应用程序
跳过。第18章 部署桌面应用程序
assembly 程序集manifest 清单
shield 盾牌
ClickOnce Web安装;Windows Installer 标准安装;InstallShield定制安装包。
相关文章推荐
- 基于C#反射机制的工厂模式
- C# WinForm登陆窗体 限制用户名只输入字母 数字以及下划线
- c#代码阅读
- C#窗体应用程序添加现有窗口项
- C#中使用DES和AES加密解密
- c#设计模式-单例模式
- C# 设计模式之简单工厂模式
- C#编程基础 实验(4)
- c# Linq Lamda表达式使用 GroupBy 分组
- C# DataTable的Select()方法不支持 != 判断
- C#委托的介绍(delegate、Action、Func、predicate)
- C#-密度较量
- C# winform窗体间传值(使用委托或事件)
- C#打印小票自带条形码打印
- 使用反射和codeDOM实现C#插件开发(1)由来
- C# WPF 按钮模板
- [C#] ZEBRA ZPL指令打印BarCode,QRCode
- C#中判断一个集合是另外一个集合的子集
- C#-委托与事件
- C#获取路径方法