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 |
XmlSerializer:XML文件序列化与反序列化,详见P426+P432。
数据绑定:绑定到本地对象;静态绑定到外部对象;动态绑定到外部对象(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");//通知属性已更改
}
}
}
路由命令: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的参数
);
}
跳过。
assembly 程序集
manifest 清单
shield 盾牌
ClickOnce Web安装;Windows Installer 标准安装;InstallShield定制安装包。