《C#入门经典v6》读书笔记2 Windows编程

第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前缀,比对应冒泡事件优先触发

布局控件:

-绝对布局相对布局线性布局表格布局
WPFCanvasDockPanelStackPanelGrid
androidRelativeLayoutLinearLayoutTableLayout

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");//通知属性已更改
        }
    }
}

第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定制安装包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KwCoding

谢了老板您讷~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值