windows编程C#编程基础

277 阅读6分钟

C# 编程基础

1.工程解析

1.1 应用解析

一个新建立的C#项目工程包含了MainPage.maml文件、MainPage.xaml.cs文件、App.xaml文件、App.xaml.cs文件、Package.appxmanifest文件、AssemblyInfo.cs文件和一些图片文件。

1.1.1 MainPage.xaml文件

<Page
    x:Class="universal_c_sharp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:universal_c_sharp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
    <Button Content="Hello world" Margin="675,315,0,0" VerticalAlignment="Top" Height="101" Width="198" Click="Button_Click"/>
</Grid>
</Page>
  • Page

Page元素是一个程序页面的根元素,表示当前的XAML代码是一个页面,当前页面的其他所有的UI元素都必须在Page元素下面。在当前的页面里面有一个控件:Grid控件。Grid控件是布局容器控件,所以在可视化视图上并没有看到Grid控件的显示。

  • Background

    在MainPage.xaml文件里面可以看到Page元素里面也包含相关的属性和命名空间,

       Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    

    表示设置了当前页面的背景,表示当前背景使用的是系统的主题资源背景;它和系统的背景主题一致。系统的背景主题修改了,当前页面的背景也会改变。在Page元素上面设置的属性将会对整个页面的其他元素产生影响。

  • Class

    x:Class="universal_c_sharp.MainPage"

    表示当前的XAML文件关联的后台代码文件是universal_c_sharp.MainPage类,通过这个设置编译器就会自动在项目中找到该类与当前页面关联起来进行编译。

  • xmlns

    xmlns:local="using:universal_c_sharp"

    表示当前的页面引入的命名空间标识符,通过该标识符可以在XAML页面里面访问所指向的空间的类。

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 代表的是默认的空间。
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"            代表专属的名字空间
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"      表示呈现一些设计时的数据,而应用真正运行起来时会帮我们忽略掉这些运行时的数据。 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 表示标记兼容性相关的内容,这里主要配合xmlns:d 使用,它包含Ignorable属性,可以在运行时忽略掉这些设计时的数据。
    mc:Ignorable="d"告诉编译器在实际运行时,忽略设计时设置的值。因为在Visual Studio 里面的可视化编程界面可以指定一些设计上相关的属性,例如 d:DesignWidth=”370”就是说这个宽度只是在设计时有效,就是我们在设计器中看到的大小,并不意味着真正运行起来就是这个值,有可能会随着手机屏幕的不同而自动调整,所以我们不应该刻意地设置页面的宽度和高度,以免被固定了,不能自动给调整。
    

1.1.2 MainPage.xaml.cs文件

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x804 上介绍了“空白页”项模板namespace universal_c_sharp
{
    /// <summary>
    /// 可用于自身或导航至 Frame 内部的空白页。
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }
   
    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        MediaElement mediaElement = new MediaElement();
        var synth = new Windows.Media.SpeechSynthesis.SpeechSynthesizer();
        Windows.Media.SpeechSynthesis.SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync("Hello, World!");
        mediaElement.SetSource(stream, stream.ContentType);
        mediaElement.Play();
    }
  }
}
​
是MainPage.xaml文件对应的后台代码的处理,在MainPage.xaml.cs文件会完成程序页面的控件的初始化工作和处理控件的触发事件。

1.1.3 App.xaml文件

是应用程序的入口XAML文件,一个应用程序只有一个该文件,并且它还会有一个对应的App.xaml.cs文件。App.xaml文件的根节点是Application元素,它里面的属性定义和空间定义与上面的MainPage.xaml页面是一样的,不一样的地方是在App.xaml文件中定义的元素是对整个应用程序是公用的,例如你在App.xaml文件中,添加了<Application.Resources></ Application.Resources>元素来定义一些资源文件或者样式,这些资源在整个应用程序的所有页面都可以引用,而在Page的页面所定义的资源或者控件就只能是在当前的页面使用。

1.1.4 App.xaml.cs文件

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
​
namespace universal_c_sharp
{
    /// <summary>
    /// 提供特定于应用程序的行为,以补充默认的应用程序类。
    /// </summary>
    sealed partial class App : Application
    {
        /// <summary>
        /// 初始化单一实例应用程序对象。这是执行的创作代码的第一行,
        /// 已执行,逻辑上等同于 main() 或 WinMain()。
        /// </summary>
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }
   
   /// <summary>
    /// 在应用程序由最终用户正常启动时进行调用。
    /// 将在启动应用程序以打开特定文件等情况下使用。
    /// </summary>
    /// <param name="e">有关启动请求和过程的详细信息。</param>
    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();
        }
    }
​
    /// <summary>
    /// 导航到特定页失败时调用
    /// </summary>
    ///<param name="sender">导航失败的框架</param>
    ///<param name="e">有关导航失败的详细信息</param>
    void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
    {
        throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
    }
​
    /// <summary>
    /// 在将要挂起应用程序执行时调用。  在不知道应用程序
    /// 无需知道应用程序会被终止还是会恢复,
    /// 并让内存内容保持不变。
    /// </summary>
    /// <param name="sender">挂起的请求的源。</param>
    /// <param name="e">有关挂起请求的详细信息。</param>
    private void OnSuspending(object sender, SuspendingEventArgs e)
    {
        var deferral = e.SuspendingOperation.GetDeferral();
        //TODO: 保存应用程序状态并停止任何后台活动
        deferral.Complete();
    }
 }
}

App.xaml.cs文件是一个控制整个应用程序的全局文件,整个应用程序的生命周期都在该文件中定义和处理。整个生命周期会有三个状态:

Running(运行中)、NotRunning(未运行)和Suspended(挂起)。

应用启动(从其他状态到Running)

应用激活(从NotRunning状态到Running状态)

应用挂起(从Running状态到Suspended状态)

应用恢复(从Suspended状态到Running状态)Package.appxmanifest文件

1.1.5 Package.appxmanifest文件

image.png 是Windows 10 应用程序的清单文件,声明应用的标识、应用的功能以及用来进行部署和更新的信息。可以在清单文件对当前的应用程序进行配置

Package 元素是整个清单的根节点;

Identity 元素表示应用程序版本发布者名称等信息;

mp:PhoneIdentity 元素表示应用程序相关的唯一标识符信息;

Properties 元素包含了应用程序的名称、发布者名称等信息的设置;

Prerequisites 元素则是用于设置应用程序所支持的系统版本号;

Resources 元素表示应用程序所使用的资源信息;

Application 元素里面则包含了与应用程序相关的logo设置、闪屏图片设置等可视化的设置信息;

Capabilities 元素表示当前应用程序所使用的一些手机特定的功能。