命名空间不能直接包含字段或方法之类的成员
checked和ischecked
line控件 checkbox控件 datapicker控件 textbox控件 button控件
获取当前时间和获取DatePicker时间
字符串比较
ContentDialog
无法将类型"string"
隐式转换为 "Windows.UI.Xaml.HorizontalAlignment"
yyyy-MM-dd
dialog.PrimaryButtonClick += (_s, _e) => { };
VerticalContentAlignment = Windows.UI.Xaml.VerticalAlignment.Center
if (textbox_title.Text == ""){
var dialog = new ContentDialog()
{
Title = "Hints",
Content = "Title can not be empty.",
VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Center,
VerticalContentAlignment = Windows.UI.Xaml.VerticalAlignment.Center,
PrimaryButtonText = "OK",
FullSizeDesired = false,
};
dialog.PrimaryButtonClick += (_s, _e) => { };
await dialog.ShowAsync();
}
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
// 不要在窗口已包含内容时重复应用程序初始化,
// 只需确保窗口处于活动状态
if (rootFrame == null)
{
// 创建要充当导航上下文的框架,并导航到第一页
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: 从之前挂起的应用程序加载状态
}
// 将框架放在当前窗口中
Window.Current.Content = rootFrame;
}
if (e.PrelaunchActivated == false)
{
if (rootFrame.Content == null)
{
// 当导航堆栈尚未还原时,导航到第一页,
// 并通过将所需信息作为导航参数传入来配置
// 参数
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
// 确保当前窗口处于活动状态
Window.Current.Activate();
}
}
参考资料
第一周的仙草作业做完了,于是写下这一篇笔记来回顾一下学习中遇到的问题与解决方案。在此之前还是要吐槽一下,仙草对我来说真的是太不友好了,又要升win10又要装vs2017(其实也是我之前比较懒,一直没升)。
言归正传,还是来回顾一下第一周的学习情况。
知识一:命名空间不能直接包含字段或方法之类的成员
这是打码时遇到的第一个问题,百度了一下就找到答案了,在此不再赘述,这个问题可以说是非常基础或者说是非常低级的错误了……引用一下百度的答案
出现"命名空间不能直接包含字段或方法之类的成员"提示:
一定是把什么代码写在类外面了,比如
namespace xxx
{
private int xxx; //error 字段
public void foo() //或者方法,都不能放在class的外面,直接位于namespace里面
{
...
}
class xxx
{
...
}
}
知识二:Checked和IsChecked
知识三:ContentDialog
这周作业中有个弹出框的要求,但最初我并没有用ContentDialog,而是想使用Message.Show(),不过缺少了System.Windows.Forms.dll(这个问题在我装上了dll之后并没有解决),导致无法引用Systems.Windows.Forms,所以我转向了ContentDialog,说到ContentDialog,又要说一下MessageDialog,这两者其实很相似,但是ContentDialog与MessageDialog相比,有一个很强大的特性,那就是ContentDialog可以作为一个控件来使用,具体可以参考以下这篇博客:Windows UWP开发系列 – MessageDialog 和 ContentDialog
说回ContentDialog,这次作业我没有把它当成一个控件,而是用在了cs文件中,代码也是参考上面那篇文章的,代码如下:
private async void onButtonClick(object sender, RoutedEventArgs e)
{
var dialog = new ContentDialog()
{
Title = "消息提示",
Content = "当前设置尚未保存,你确认要退出该页面吗?",
PrimaryButtonText = "确定",
SecondaryButtonText = "取消",
FullSizeDesired = false,
};
dialog.PrimaryButtonClick += (_s, _e) => { };
await dialog.ShowAsync();
}
效果如下,这里还是借用了一下上面的博客
如图,ContentDialog有两个按钮,PrimaryButton和SecondaryButton,它们关联事件的方法有PrimaryButtonClick和PrimaryButtonCommand两种。
注意最后一句,await dialog.ShowAsync();
这个语句表明异步弹出提示框,这个语句有一个ContentDialogResult类型的返回值,也就是说,我们可以写成ContentDialogResult result = await dialog.ShowAsync();
的形式,以此获得用户的选择结果,比如用户选择了第一个按钮,则得到ContentDialogResult.Primary,而ContentDialogResult.Secondary表明用户选择了第二个按钮,ContentDialogResult.None 则说明用户没有选择(按了系统的“返回”按钮)。这个知识点在与众不同 windows phone (49) - 8.1 新增控件: 概述, ContentDialog, MapControl 中有详细的介绍,知识点很多,可以慢慢消化。
知识四:Lambda表达式
这个知识点对我来说有点困难,最初也没有往这个方向学习的想法,但是在上一个知识点ContentDialog的学习中遇到了,就是下面这个语句dialog.PrimaryButtonClick += (_s, _e) => { };
当我看ContentDialog知识的时候,发现这个句子有一些奇怪,首先是+= (_s, _e)
,+=
的右边是一对圆括号,里面还有两个参数,而且这两个参数在这个函数中没有出现过,其次是=> { }
,这个=>
在平时的编程中就比较少用,而且右边还有个一堆空的大括号,让人觉得非常奇怪。
然后是在咨询同学知道这是一个Lambda表达式,于是就查阅了一下Lambda的资料,说一下自己的理解,C#中的lambda表达式可以与C#中的委托相结合,委托是C#中一个很强大的概念,使用委托与Lambda表达式相结合的方式可以使代码变得更简洁易懂。来看一下Lambda的形式,这个=>
是一个很关键的地方,这个是lambda运算符,左边是参数或者参数列表,右边是Lambda主体。Lambda表达式的形式可以是: 1.一个参数:param=>expr
或者2.多个参数:(param-list)=>expr
。Lambda表达式是一种匿名函数,顾名思义,Lambda表达式将函数名称给隐藏了,这个函数名称应该是存在的,但是我们不可见,我的理解是,右边的Lambda主题是这个函数的具体实现方法,而这个参数列表则是这个函数所需的参数列表。举个例子:x => {return x + 1;}
也许可以这样理解,这个一个函数,姑且命名为getX函数,看=>
右边,这个函数返回一个值,我们假设这个返回类型为int,实现方法为return x + 1
,左边为参数x,那么这个匿名函数可以写成以下形式:
int getX(int x){
return x + 1;
}
然后讲一下C#的委托机制,我也不是很懂,就粗略地写一下,此处引用【C#】C#中Lambda表达的使用的例子。比如我们声明了一个委托 delegate int Method(int a, int b);
,那么这个Method方法可以用于任何一个有两个int类型参数,返回类型为int的函数,然后我们再定义一个方法:
int Add(int a, int b){
return a + b;
}
那么我们就可以这样通过委托调用方法:
Method m += Add;
Console.WriteLine(m(2, 3));
我们把这个方法当成一个参数传给委托的方法,听起来有点绕口,把方法当成方法的参数,也就是说现在这个m已经具有了Add的方法,所以编译器显示的就是5。
说完委托,来看一下委托和匿名函数的结合,前面说到Lambda表达式可以把函数名称隐藏起来,我们可以把Add的函数名隐藏起来,写成(a, b) => { return a + b; }
的形式,那么和委托结合起来,可以写成 Method m += (a, b) => { return a + b; }
。这样看起来就十分简洁明了了。
讲完了委托和Lambda表达式,我们回到刚刚那段代码:dialog.PrimaryButtonClick += (_s, _e) => { };
现在就可以理解了在委托链上增加了一个委托,我们可以把它看成是
dialog.PrimaryButtonClick += new EventHandler(Button_Click);
private void Button_Click(object sender, EventArgs e) {};
点击PrimaryButton执行一个空函数,这个就是这个语句表达的意思。(?有个问题,为什么dialog.PrimaryButtonClick是个委托?)
这部分可以参考这篇文章【C#】C#中Lambda表达的使用,讲的很清楚。另外,关于Lambda的显式签名和隐式签名以及匿名函数的更多细节可以参考下面这篇博客[深入学习C#]匿名函数、委托和Lambda表达式。至于委托,留作这周的任务慢慢研究。
知识五:无法将类型"string"
隐式转换为 "Windows.UI.Xaml.HorizontalAlignment"