赞助广告

 

年份

最新评论

评论 RSS

创建“Hello, world”应用(使用 C#/VB 和 XAML 的 Metro 风格应用)

clock 九月 11, 2012 09:00 by author alex
此教程指导你如何结合使用可扩展应用程序标记语言 (XAML) 和 Microsoft Visual Basic 或 C# 创建简单的“Hello, world”Metro 风格应用。此为系列中的第一个教程,指导你构建所需任何类型的 Metro 风格应用所需了解的事项。 在本教程中,你将了解如何: 创建新项目 向开始页面中添加 XAML 内容 处理触控、笔以及鼠标输入 在浅色主题和深色主题之间切换 创建自己的自定义样式 我们说明如何使用 XAML 和 Visual Basic 或 C# 创建 Metro 风格应用。 有关这些教程的 JavaScript、HTML 以及 CSS 版本,请参阅使用 JavaScript 创建你的第一个 Metro 风格应用。 有关 C++ 和 XAML 教程,请参阅使用 C++ 创建你的第一个 Metro 风格应用。 有关 DirectX 和 C++ 教程,请参阅使用 DirectX 创建你的第一个 Metro 风格应用。 开始之前... 若要完成本教程,你需要具备 Windows 8 和 Microsoft Visual Studio Express 2012 for Windows 8。若要下载以上内容,请参阅获取工具。 你还需要具备开发者许可证。有关说明,请参阅获取开发者许可证。 步骤 1:在 Microsoft Visual Studio 中创建新项目 启动 Visual Studio Express 2012 for Windows 8。 会出现 Visual Studio Express 2012 for Windows 8 开始屏幕。 (继续操作,我们将参考 Visual Studio Express 2012 for Windows 8,正如 "Visual Studio" 一样。) 选择“文件”>“新建项目”。 会出现“新建项目”对话框。可以在对话框的左侧窗格中选择要显示模板的类型。 在左侧窗格中,展开“已安装”,然后展开 Visual Basic 或 Visual C# 并选择“Windows Metro 风格”模板类型。对话框的中心窗格显示用于 Metro 风格应用的项目模板列表。 在本教程中,我们使用“空白应用”模板。“空白应用”模板创建一个最基本的 Metro 风格应用,该应用可以编译和运行,但不包含任何用户界面控件或数据。你使用这些教程课程向应用中添加控件和数据。 在中心窗格中,选择“空白应用”模板。 在“名称”文本框中,输入 "HelloWorld"。 单击“确定”可创建项目。 Visual Studio 创建项目并在“解决方案资源管理器”中显示该项目。 尽管“空白应用”为最基本的模板,但该模板仍包含很多文件: 清单文件 (package.appxmanifest) 介绍应用(它的名称、介绍、磁贴、开始页面等等)并列出应用包含的文件。 要在开始屏幕中显示的一组大的和小的徽标图像(logo.png 和 smalllogo.png)。 表示应用位于 Windows 应用商店的图像 (storelogo.png)。 显示应用启动时间的初始屏幕 (splashscreen.png)。 应用的 XAML 和代码文件(App.xaml 和 App.xaml.cs/.vb)。 开始页面 (MainPage.xaml) 和附带的代码文件 (MainPage.xaml.cs/.vb),这些文件在应用启动时运行。 这些文件是使用 Visual Basic 或 C# 的所有 Metro 风格应用必不可少的文件。在 Visual Studio 中创建的所有项目都包含这些文件。 替换 MainPage “空白应用”项目模板中的 MainPage 基于“空白页”模板。该模板包含实例化 Page 的最少数量的 XAML 和代码。Visual Studio 中的其他项目和 Page 模板包含一些其他代码和帮助程序类,这些内容有助于开始创建 Metro 风格应用。使用“空白应用”项目模板时,可以使用其他 Page 模板之一替换空白 MainPage来利用它们提供的布局和帮助程序类。在本示例中,使用“基本页”替换默认的 MainPage。此系列的后面教程取决于“基本页”模板使用的帮助程序类。 在空白应用中替换 MainPage 在“解决方案资源管理器”中,右键单击 MainPage.xaml,然后选择“删除”。 单击“确定”确认删除操作。 选择“项目”>“添加新项”。将打开“添加新项目”对话框。该对话框的外观类似于“新建项目”对话框。 在“已安装”窗格中,展开 Visual C# 或 Visual Basic。 选择“Windows Metro 风格”模板类型。 在中心窗格中,选择要添加到项目中的页面类型。对于本示例,请选择“基本页”。 为该页面输入一个名称。对于本示例,请输入 "MainPage"。 单击“添加”。你的页面的 XAML 和代码隐藏文件即被添加到项目中。 首次向“空白应用”模板添加新页面(“空白页”除外)时,Visual Studio 会显示含有消息的对话框,告知你添加操作取决于项目缺失的文件。单击“是”可添加这些文件。将用于多种实用工具类的文件添加到 Common 文件夹中的项目中。 按 F7 可构建应用。新页会显示设计器中的错误,直至你构建该设计器依赖的帮助程序类。 步骤 2:启动应用 此时,我们创建了非常简单的应用。如果你想看它的外观,按 F5 可在调试模式下构建、部署并启动应用。首先会出现默认的初始屏幕,然后会出现应用。它包含黑屏和标题“我的应用程序”""。 没有关闭应用的按钮或命令。你可以使用关闭手势或 Alt+F4 来关闭应用,但通常不会关闭 Metro 风格应用,正如我们在部分 2:应用生命周期和状态中讨论的详细信息。按 Windows 键可转到“开始”屏幕;请注意,部署应用会将应用的磁贴添加到“开始”屏幕的最后一组。若要再次运行应用,请在开始屏幕上点击或单击应用的磁贴,或在 Visual Studio 中按 F5 在调试模式下运行该应用。 该过程不会执行很多操作——,只是祝贺你已构建第一个 Metro 风格应用! 若要停止调试应用,请按 Alt+Tab 来返回到 Visual Studio。在 Visual Studio 中,单击“调试”>“停止调试”可关闭应用。当你在调试过程中时,无法在 Visual Studio 中编辑。 有关详细信息,请参阅从 Visual Studio 运行 Metro 风格应用。 步骤 3:修改你的开始页面 文件中包含哪些内容? 创建使用“空白应用”模板的新项目时,Visual Studio 会创建含有少数文件的应用。若要查看和编辑文件,请双击“解决方案资源管理器”中的文件。可以像展开文件夹一样展开 XAML 文件来查看其关联的代码文件。默认情况下,XAML 文件在拆分视图中打开,该视图显示设计界面和 XAML 编辑器。 在本教程中,我们只使用少量以前列出的文件:App.xaml、App.xaml.cs/.vb、MainPage.xaml 以及 MainPage.xaml.cs/.vb。 App.xaml 为声明在应用中所使用资源的位置。此文件包含 ResourceDictionary,它含有对位于 Common 文件夹中的 StandardStyles.xaml ResourceDictionary 的引用。StandardStyles.xaml 提供了一组默认样式,它们为应用提供 Windows 8 外观和感觉。 XAML 复制 <Application x:Class="HelloWorld.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:HelloWorld"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <!-- Styles that define common aspects of the platform look and feel Required by Visual Studio project and item templates --> <ResourceDictionary Source="Common/StandardStyles.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application> App.xaml.cs/.vb 为 App.xaml 的代码隐藏文件。代码隐藏为与 XAML 页的部分类结合的代码。同时,XAML 和代码隐藏成为完整的类。App.xaml.cs/.vb 为应用的入口点。与所有代码隐藏页面一样,它包含一个调用 InitializeComponent 方法的构造函数。你未编写 InitializeComponent 方法。它由 Visual Studio 生成,且其主要作用为初始化在 XAML 文件中声明的元素。App.xaml.cs/.vb 还包含处理应用激活和挂起的方法。在部分 2:应用生命周期和状态中,向这些方法添加一些代码。 C# VB 复制 using System; using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; // The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227 namespace HelloWorld { /// <summary> /// Provides application-specific behavior to supplement the default Application class. /// </summary> sealed partial class App : Application { /// <summary> /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). /// </summary> public App() { this.InitializeComponent(); this.Suspending += OnSuspending; } /// <summary> /// Invoked when the application is launched normally by the end user. Other entry points /// will be used when the application is launched to open a specific file, to display /// search results, and so forth. /// </summary> /// <param name="args">Details about the launch request and process.</param> protected override void OnLaunched(LaunchActivatedEventArgs args) { // Do not repeat app initialization when already running, just ensure that // the window is active if (args.PreviousExecutionState == ApplicationExecutionState.Running) { Window.Current.Activate(); return; } if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: Load state from previously suspended application } // Create a Frame to act navigation context and navigate to the first page var rootFrame = new Frame(); if (!rootFrame.Navigate(typeof(MainPage))) { throw new Exception("Failed to create initial page"); } // Place the frame in the current Window and ensure that it is active Window.Current.Content = rootFrame; Window.Current.Activate(); } /// <summary> /// Invoked when application execution is being suspended. Application state is saved /// without knowing whether the application will be terminated or resumed with the contents /// of memory still intact. /// </summary> /// <param name="sender">The source of the suspend request.</param> /// <param name="e">Details about the suspend request.</param> private void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); //TODO: Save application state and stop any background activity deferral.Complete(); } } } 在 MainPage.xaml 文件中,为应用定义 UI。你可以直接使用 XAML 标记添加元素,也可以使用 Visual Studio 提供的设计工具。“基本页”模板使用 LayoutAwarePage。此类扩展了基本的 Page 类并提供导航方法、状态管理以及视图管理。“基本页”还包含一些简单的内容,如后退按钮和页面标题。 XAML 复制 <common:LayoutAwarePage x:Name="pageRoot" x:Class="HelloWorld.MainPage" DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}" IsTabStop="false" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:HelloWorld" xmlns:common="using:HelloWorld.Common" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Page.Resources> <!-- TODO: Delete this line if the key AppName is declared in App.xaml --> <x:String x:Key="AppName">My Application</x:String> </Page.Resources> <!-- This grid acts as a root panel for the page that defines two rows: * Row 0 contains the back button and page title * Row 1 contains the rest of the page layout --> <Grid Style="{StaticResource LayoutRootStyle}"> <Grid.RowDefinitions> <RowDefinition Height="140"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!-- Back button and page title --> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Button x:Name="backButton" Click="GoBack" IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}" Style="{StaticResource BackButtonStyle}"/> <TextBlock x:Name="pageTitle" Grid.Column="1" Text="{StaticResource AppName}" Style="{StaticResource PageHeaderTextStyle}"/> </Grid> <VisualStateManager.VisualStateGroups> <!-- Visual states reflect the application's view state --> <VisualStateGroup x:Name="ApplicationViewStates"> <VisualState x:Name="FullScreenLandscape"/> <VisualState x:Name="Filled"/> <!-- The entire page respects the narrower 100-pixel margin convention for portrait --> <VisualState x:Name="FullScreenPortrait"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="backButton" Storyboard.TargetProperty="Style"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PortraitBackButtonStyle}"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <!-- The back button and title have different styles when snapped --> <VisualState x:Name="Snapped"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="backButton" Storyboard.TargetProperty="Style"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SnappedBackButtonStyle}"/> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="pageTitle" Storyboard.TargetProperty="Style"> <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SnappedPageHeaderTextStyle}"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </Grid> </common:LayoutAwarePage> MainPage.xaml.cs/.vb 为 MainPage.xaml 的代码隐藏页面。在此,你添加应用逻辑和事件处理程序。“基本页”模板包含 2 个方法,你可以保存和加载页面状态至其中。 C# VB 复制 using System; using System.Collections.Generic; using Windows.UI.Xaml.Controls; // The Basic Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234237 namespace HelloWorld { /// <summary> /// A basic page that provides characteristics common to most applications. /// </summary> public sealed partial class MainPage : HelloWorld.Common.LayoutAwarePage { public MainPage() { this.InitializeComponent(); } /// <summary> /// Populates the page with content passed during navigation. Any saved state is also /// provided when recreating a page from a prior session. /// </summary> /// <param name="navigationParameter">The parameter value passed to /// <see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested. /// </param> /// <param name="pageState">A dictionary of state preserved by this page during an earlier /// session. This will be null the first time a page is visited.</param> protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState) { } /// <summary> /// Preserves state associated with this page in case the application is suspended or the /// page is discarded from the navigation cache. Values must conform to the serialization /// requirements of <see cref="SuspensionManager.SessionState"/>. /// </summary> /// <param name="pageState">An empty dictionary to be populated with serializable state.</param> protected override void SaveState(Dictionary<String, Object> pageState) { } } } 修改开始页面 我们来向 MainPage.xaml 文件添加一些内容。 修改开始页面 若要更改页面标题,请查找页面顶部附近的 AppName 资源。将值从“我的应用程序”""更改为 "Hello, world!"。 XAML 复制 <x:String x:Key="AppName">Hello, world!</x:String> 在根 Grid 中,紧挨 <VisualStateManager.VisualStateGroups> 标记之前,添加带有 TextBlock 的 StackPanel,它询问用户名、接受用户名的 TextBox 元素、Button 以及另一 TextBlock 元素。有关 XAML 布局的详细信息,请参阅快速入门:定义布局。 XAML 复制 <StackPanel Grid.Row="1" Margin="120,30,0,0"> <TextBlock Text="What's your name?"/> <StackPanel Orientation="Horizontal" Margin="0,20,0,20"> <TextBox x:Name="nameInput" Width="300" HorizontalAlignment="Left"/> <Button Content="Say &quot;Hello&quot;"/> </StackPanel> <TextBlock x:Name="greetingOutput"/> </StackPanel> 按 F5 以运行应用。它的外观如下所示。 你可以在 TextBox 中键入,但此时,单击 Button 不会有任何作用。在接下来的步骤中,你为按钮的 Click 事件创建事件处理程序,该事件显示了个性化问候。向 MainPage.xaml.cs/.vb 文件添加事件处理程序代码。 步骤 4:创建事件处理程序 XAML 元素可以在出现某些事件时发送消息。这些事件消息为你提供了机会,可以采取一些操作响应事件处理程序方法中的事件。 多个应用中最常见事件之一为用户单击 Button。 我们来为按钮的 Click 事件创建事件处理程序。 事件处理程序会从 nameInput TextBox 控件获取用户名并使用该用户名向 greetingOutput TextBlock 输出问候。 使用用于触控、鼠标和笔输入的事件 你应处理什么事件?由于事件可以运行在各种设备上,请牢记设计具有触控输入的 Metro 风格应用。应用还必须可以处理来自鼠标或触笔的输入。幸运的是,诸如 Click 和 DoubleTapped 的事件与设备无关。如果你熟悉 Microsoft .NET 编程,你可能已分离用于鼠标、触控以及触笔输入的事件,如 MouseMove、TouchMove 以及 StylusMove。在 Metro 风格应用中,这些事件使用单个的 PointerMoved 事件替换,该事件同样适用于触控、鼠标以及触笔输入。 添加事件处理程序的步骤 在 XAML 或设计视图中,选择已添加到 MainPage.xaml 的 Button。 在“属性窗口”中,单击“事件”按钮 ()。 提示  如果你没有看到“属性窗口”,则按 Alt+Enter 将其打开。 在事件列表的顶部查找 Click 事件。在事件的文本框中,键入处理 Click 事件的函数名称。对于本示例,请键入 "Button_Click"。 按 Enter。事件处理程序方法在代码编辑器中创建和打开,因此你可以添加在事件出现时执行的代码。 在 XAML 编辑器中,Button 的 XAML 随 Click 事件进行更新。 XAML 复制 <Button Content="Say &quot;Hello&quot;" Click="Button_Click"/> 向在代码隐藏页面中创建的事件处理程序添加代码。在事件处理程序中,从 nameInput TextBox 控件检索用户名并使用该控件创建问候。使用 greetingOutputTextBlock 显示结果。 C# VB 复制 private void Button_Click(object sender, RoutedEventArgs e) { greetingOutput.Text = "Hello, " + nameInput.Text + "!"; } 按 F5 可构建并运行应用。当你在文本框中输入姓名并单击按钮后,应用会显示个性化问候。 部分 5:设置开始页面的样式 选择主题 轻松自定义应用的外观和感觉。默认情况下,应用使用深色样式的资源。系统资源还包含浅色主题。我们来尝试一下并看看它的外观。 切换到浅色主题 在解决方案资源管理器中,双击 App.xaml 打开它。 在打开 Application 标记中,添加 RequestedTheme 属性,并将其值设置为“浅色”:RequestedTheme="Light"。 XAML 复制 <Application x:Class="HelloWorld.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:HelloWorld" RequestedTheme="Light"> 运行应用。现在它使用浅色主题。 你应使用哪个主题?你需要的任何一个。对于主要显示图像或视频的应用,我们建议使用深色主题;对于包含大量文本的应用,我们建议使用浅色主题。(如果你使用的是自定义配色方案,则使用最适合应用外观和感觉的主题。) 使用标准样式 在本教程的前面部分,我们已指出 App.xaml 文件包含对 StandardStyles.xaml ResourceDictionary 的参考: XAML 复制 <ResourceDictionary.MergedDictionaries> <!-- Styles that define common aspects of the platform look and feel Required by Visual Studio project and item templates --> <ResourceDictionary Source="Common/StandardStyles.xaml"/> </ResourceDictionary.MergedDictionaries> 此时,所有文本都非常小,因此很难阅读。你可以轻松将标准样式应用到应用中的元素以使其美观。 设置元素的样式 在 XAML 或设计视图中,选择添加到 MainPage.xaml 的第一个 TextBlock。 在“属性窗口”中,单击“属性”按钮 ()。 提示  如果你没有看到“属性窗口”,则按 Alt+Enter 将其打开。 展开“其他”组并查找“样式”属性。 单击“样式”属性旁边的小正方形可打开菜单。 在菜单中,选择“本地资源”> BasicTextStyle。 BasicTextStyle 为在 StandardStyles.xaml ResourceDictionary 中定义的资源。 在设计器中,文本外观会更改。在 XAML 编辑器中,TextBlock 的 XAML 会进行更新。 XAML 复制 <TextBlock Text="What's your name?" Style="{StaticResource BasicTextStyle}"/> 重复该过程可将 BasicTextStyle 分配至 greetingOutputTextBlock 元素。 现在你的 XAML 如下所示。 XAML 复制 <StackPanel Grid.Row="1" Margin="120,30,0,0"> <TextBlock Text="What's your name?" Style="{StaticResource BasicTextStyle}"/> <StackPanel Orientation="Horizontal" Margin="0,20,0,20"> <TextBox x:Name="nameInput" Width="300" HorizontalAlignment="Left"/> <Button Content="Say &quot;Hello&quot;" Click="Button_Click"/> </StackPanel> <TextBlock x:Name="greetingOutput" Style="{StaticResource BasicTextStyle}"/> </StackPanel> 按 F5 可构建并运行应用。现在它的外观如下所示。 创建自己的样式 如果要自定义应用的外观和感觉,不必去除系统样式而从头开始。通过替代要更改的样式来进行递增更改会非常方便。 实际上,替代标准样式比创建自己的样式要好。当你的应用在高对比度模式下运行时,对默认样式中的颜色进行的任何更改都会由支持高对比度的配色方案自动替代。 你可以替代标准样式中的任何样式,方法是创建自己的样式并将其包含在 StandardStyles.xaml ResourceDictionary 后。有关详细信息,请参阅快速入门:设置控件样式。 使用自己的样式 在 XAML 或设计视图中,选择已添加到 MainPage.xaml 的 greetingOutput TextBlock。 展开“其他”组并查找“样式”属性。 单击“样式”属性旁边的小正方形可打开菜单。 在菜单中,选择“转换为新资源...”。会打开“创建样式资源”对话框。 注意  要修改的样式必须已被选中。在本示例中,BasicTextStyle 可能从前面步骤中选中。 在“创建样式资源”对话框中,输入 "BigGreenTextStyle" 作为资源键,并选择选项来定义应用程序中的资源。 单击“确定”。新样式会在 App.xaml 中创建且 TextBlock 会更新以使用新的样式资源。 XAML 复制 <TextBlock x:Name="greetingOutput" Style="{StaticResource BigGreenTextStyle}"/> 单击“样式”属性旁边的小正方形可再次打开菜单。 在菜单中,选择“编辑资源”。App.xaml 会在编辑器中打开。 在 "BigGreenTextStyle" 资源中,将 Foreground 值更改为"“绿色”",将 FontSize 值更改为 "36"。 XAML 复制 <Style x:Key="BigGreenTextStyle" TargetType="TextBlock"> <Setter Property="Foreground" Value="Green"/> <Setter Property="FontSize" Value="36"/> <Setter Property="FontFamily" Value="{StaticResource ContentControlThemeFontFamily}"/> <Setter Property="TextTrimming" Value="WordEllipsis"/> <Setter Property="TextWrapping" Value="Wrap"/> <Setter Property="Typography.StylisticSet20" Value="True"/> <Setter Property="Typography.DiscretionaryLigatures" Value="True"/> <Setter Property="Typography.CaseSensitiveForms" Value="True"/> </Style> 按 F5 可构建并运行应用。问候语现在以较大的绿色字母显示。 摘要 祝贺你完成第一个教程!你已经了解如何将内容添加到 Metro 风格应用。而且你已经了解如何添加交互性和如何设置应用样式。 后续步骤 在此教程系列的下一部分中,你会了解有关应用生命周期工作原理和保存应用状态的方法的信息。

windows 8 实例代码

clock 九月 6, 2012 15:31 by author alex
1 Win8 Metro下的MessageBox private async void No_But_Click(object sender, RoutedEventArgs e)         {             MessageDialog msg = new MessageDialog("你真的要确定退出你的应用吗?", "桂素伟提示");             msg.Commands.Add(new UICommand("是", new UICommandInvokedHandler(this.CommandInvokedHandler)));             msg.Commands.Add(new UICommand("否", new UICommandInvokedHandler(this.CommandInvokedHandler)));             await msg.ShowAsync();         }         private void CommandInvokedHandler(IUICommand command)         {                                 this.Dispatcher.Invoke(Windows.UI.Core.CoreDispatcherPriority.Normal, (s, a) =>             {                 UserName_TB.Text = command.Label;             }, this, null);         } 2 消除AppBar阻挡 <AppBar Name="pb"   VerticalAlignment="Bottom" HorizontalContentAlignment="Stretch" Height="88" VerticalContentAlignment="Stretch" Background="#E5058AE6" Visibility="Collapsed">             <Grid>                 <Grid.ColumnDefinitions>                     <ColumnDefinition/>                     <ColumnDefinition/>                 </Grid.ColumnDefinitions>                 <StackPanel Grid.Column="1" Orientation="Horizontal"/>                 <StackPanel Orientation="Horizontal"/>             </Grid>         </AppBar> 后台代码: protected override void OnRightTapped(RightTappedRoutedEventArgs e)         {                 if (!pb.IsOpen)             {                 pb.Visibility = Visibility.Visible;             }             else             {                 pb.Visibility = Visibility.Collapsed;             }             base.OnRightTapped(e);                       } 3 Image加载图片    img.Source = new BitmapImage(new Uri( "ms-appx:/Images/a.png", UriKind.RelativeOrAbsolute)); 4 获取摄像头图片 private async void Button_Click_1(object sender, RoutedEventArgs e)         { CameraCaptureUI camera = new CameraCaptureUI();             camera.PhotoSettings.CroppedAspectRatio = new Size(1, 1);//比例                 camera.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Png;//图片格式             // dialog.PhotoSettings.CroppedSizeInPixels = new Size(100, 150);//固定大小                     StorageFile file = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo);             if (file != null)             {                 BitmapImage bitmapImage = new BitmapImage();                 using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))                 {                     bitmapImage.SetSource(fileStream);                 }                 img.Source = bitmapImage;                 aaa.Content = file.Path;             } } 5 获取摄像头视频 private async void Button_Click_1(object sender, RoutedEventArgs e)         {             CameraCaptureUI dialog = new CameraCaptureUI();             dialog.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4;             StorageFile file = await dialog.CaptureFileAsync(CameraCaptureUIMode.Video);             if (file != null)             {                               IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);                 mediaelement.SetSource(fileStream,"video/mp4");             }         } 6 获取摄像头视频到程序中   MediaCapture mediaCaptureMgr;             private async void Button_Click_1(object sender, RoutedEventArgs e)         {             mediaCaptureMgr = new MediaCapture();             await mediaCaptureMgr.InitializeAsync();             Scenario1Video.Source = mediaCaptureMgr;             await mediaCaptureMgr.StartPreviewAsync();             } 7 获取系统文件 FileOpenPicker openPicker = new FileOpenPicker();             openPicker.ViewMode = PickerViewMode.List;//显示文件样式             openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;//图片库为查找目标路径             openPicker.FileTypeFilter.Add(".iso");         //查找文件类型             IReadOnlyList<StorageFile> files = await openPicker.PickMultipleFilesAsync();//获取文件             //显示文件             foreach (StorageFile v in files)             {                 lv.Items.Add(v.Path);             }

C# DateTime日期和byte[]之间的转换

clock 九月 5, 2012 11:21 by author alex
用了2个byte,日期范围 2000-01-01 ~ 2127-12-31,下面是转换方法:         // Date -> byte[2]         public static byte[] DateToByte(DateTime date)         {             int year = date.Year - 2000;             if (year < 0 || year > 127)                 return new byte[4];             int month = date.Month;             int day = date.Day;             int date10 = year * 512 + month * 32 + day;             return BitConverter.GetBytes((ushort)date10);         }         // byte[2] -> Date         public static DateTime ByteToDate(byte[] b)         {             int date10 = (int)BitConverter.ToUInt16(b, 0);             int year = date10 / 512 + 2000;             int month = date10 % 512 / 32;             int day = date10 % 512 % 32;             return new DateTime(year, month, day);         } 调用举例:             byte[] write = DateToByte(DateTime.Now.Date);             MessageBox.Show(ByteToDate(write).ToString("yyyy-MM-dd"));

C#编写QQ接口软件

clock 七月 30, 2011 17:28 by author alex
1、找寻支持QQ HTTP协议的服务器。
大家也许会被一些假像所迷惑,也许会认为QQ的HTTP服务器是基于80口进行通信的(如:218.17.209.23:80),其实不然,正真基于HTTP的服务器应该是:http://tqq.tencent.com:8000,它是一个通过8000口进行通讯的服务器。
由于QQ的HTTP服务器并不支持HTTP协议中GET方法,它支持POST方法。所以我们要给QQ的HTTP协议传参数,那么就必需要用POST方式才行。
2、C#和DELPHI是实现HTTP的POST方法的通信。
[更多...]

C#程序员转android开发

clock 七月 1, 2011 16:19 by author alex
随着3G网络的发展,android手机的普及。android软件开发必将掀起一股热潮。哥是名.net程序员,擅长的是C#语言,而android使用的是java。这咋一看两者矛盾,其实这两种语言之间有着惊人的相似。甚至忽略某些细节你可以把他们当成是同一种语言。虽然现在monodroid已经出现,想了解monodroid可以看这篇文章http://www.cnblogs.com/szp11/archive/2010/10/12/1837327.html 但指望它短时间内成熟,真正能用在android系统上,估计短时间内不太可能,所以最理想的办法就是转JAVA。看了下面的文章,就可以做到C#-Java转换自如。这篇文章节选自博客园 http://www.cnblogs.com/lrary/archive/2005/11/22/282325.html C# VS JAVA 很多人说C#是微软用来和Java抗衡的武器,因为二者在很大程度上有着惊人的相似, 尽管如此,两者不同的地方也很多,所谓“于细微处见差异”。那么两者的相似和区 别都在什么地方呢?我们从今天开始,会从各个角度来对比C#和Java的特点,希望能 对正在学习、使用C#的朋友有所帮助。 1、C#和.NET平台的概貌 2000年6月,微软发布C#语言和.NET平台。C#语言是一种强类型的,面向对象的 语言,它具有语法简单、表达力强的特点,而.NET平台则是构成微软的“.NET计划” 的基石。 .NET平台的核心包括两方面,一方面就是著名的通用语言运行机(Common Language Runtime),虽然这个名词起得晦涩了点,不过大家可以拿它和Java的虚拟 机来作比较,二者完成的任务大致相同;另一方面就是一大堆通用函数库,这些库函 数可以被多种语言调用,并且通过编译都产生一种共同的中间语言(Intermediate Language),这种语言也可以拿Java的字节码来类比,虽然完成的方式有些不一样。 2、C#和Java 下面简单地把C#和Java的相似处列出来,虽然在这里我们重点讨论的是C#和Java 的不同点,但是了解一下二者的相同之处也是很有必要的。 二者都编译成跨平台的、跨语言的代码,并且代码只能在一个受控制的环境中运 行 自动回收垃圾内存,并且消除了指针(在C#中可以使用指针,不过必须注明 unsafe关键字) 都不需要头文件,所有的代码都被“包(package)”限制在某个范围内,并且因 为没有头文件,所以消除了类定义的循环依赖 所有的类都是从对象派生出来,并且必须使用New关键字分配内存 用对象加锁的方式来支持多线程 都具有接口(interface)的概念 内部类 继承类的时候不会以某种特定的访问权限来继承; 没有全局函数或者常量,一切必须属于类; 数组或者字符串都自带长度计算和边界检查; 只使用“.”操作符,没有“-&gt;”和“::”; “null”、“boolean”和“bool”成为了关键字; 任何变量均在使用前进行初始化; 不能使用整数来返回到if条件语句中,必须使用布尔值; “Try”模块后可以有“finally” ; 3. 属性(Property) 属性的概念对大家来说应该是很熟悉的,类成员函数可以自由地访问本类中的任 何属性成员。不过若要从一个类中去访问另一个类中的属性,那就比较麻烦了,所以 很多时候我们使用Getxxx和Setxxx方法,这样看起来显得极不自然,比如用Java或者 C++,代码是这样的: foo.setSize (getSize () + 1); label.getFont().setBold (true); 但是,在C#中,这样的方法被“属性化”了。同样的代码,在C#就变成了: foo.size++; label.font.bold = true; 可以看出来,C#显然更容易阅读和理解。我们从这个“属性方法”的子程序代码 中,也可以看到类似情况: Java/C++: public int getSize() { return size; } public void setSize (int value) { size = value; } C#: public int Size { get{return size;} set{size = value;} } 为了区分这种属性化的方法和类的属性成员,在C#中把属性成员称作“域 (field)”,而“属性”则成为这种“属性化的方法”专用的名词。顺便说一句,其 实这样的属性化方法在VB和DELPHI中是经常碰到的,在VB中它也就叫属性。 另外,在C#中Get和Set必须成对出现,一种属性不能只有Get而没有Set(在Java 和C++中就可以只有Get或者只有Set),C#中这样做的好处在于便于维护,假如要对 某种属性进行修改,就会同时注意Get和Set方法,同时修改,不会改了这个忘了那 个。 4、对象索引机制(Indexer) C#中引入了对象索引机制。说得明白点,对象索引其实就是对象数组。这里和上 一节中的属性联系起来讲一下,属性需要隐藏Get和Set方法,而在索引机制中,各个 对象的Get或者Set方法是暴露出来的。比如下面的例子就比较清楚地说明了这一点。 public class Skyscraper { Story[] stories; public Story this [int index] { get { return stories [index]; } set { if (value != null) { stories [index] = value; } } } ... } Skyscraper empireState = new Skyscraper (...); empireState [102] = new Story ("The Top One", ...); 呵呵,有了这种特性,我们就再不用怕课堂上老师叫我们写对象数组这种程序 了。 5. 指代(Delegate) 指代这个玩意很特别,它有点象指针,但又不完全是,不过大家还是可以把它理 解为一种类型安全的、面向对象的指针。(什么是类型安全和面向对象就不用讲了吧 ?)顺便提一句,有很多书上把Delegate翻译成代理,我觉得这样翻不够确切,翻译 成“指代”更恰当些,道理上吻合,并且还符合它的本来意思——微软本来就是用 Delegate来“取代指针”,所以叫“指代”,呵呵。 说起指代,也许至今Sun还会对它愤愤不已,为什么呢?因为在Sun的标准Java中 是没有这个东西的,它是微软99年发布的MSVJ++6添加的“新特性”。为此,两家公 司吵得不亦乐乎,并且还专门在网上写了大量文章互相攻击,有兴趣的朋友可以去看 看(只有英文版)。 http://www.Javasoft.com/docs/white/delegates.html http://msdn.microsoft.com/visualj/technical/articles/delegates/truth.asp 话归正传,指代有什么特点呢?一个明显的特点就是它具有了指针的行为,就好 象从Java又倒回到了C++。在C#中,指代完成的功能大概和C++里面的指针,以及Java 中的接口相当。但是,指代比起C++的“正宗指针”来又要高明一些,因为它可以同 时拥有多个方法,相当于C++里面的指针能同时指向多个函数,并且是类型安全的, 这一点体现了它的“对象”特性;而比起Java的接口来,指代高明的地方在于它能可 以不经过内部类就调用函数,或者用少量代码就能调用多种函数,这一点体现了它的 “指针”特性。呵呵,很有“波粒二象性”的味道吧?指代最重要的应用在于对于事 件的处理,下一节我们将重点介绍。 6、事件(Event) C#对事件是直接支持的(这个特点也是MSVJ所具有的)。当前很多主流程序语言 处理事件的方式各不相同,Delphi采用的是函数指针(这在Delphi中的术语是 “closure”)、Java用改编类来实现、VC用WindowsAPI的消息系统,而C#则直接使 用delegate和event关键字来解决这个问题。下面让我们来看一个例子,例子中会给 大家举出声明、调用和处理事件的全过程。 //首先是指代的声明,它定义了唤醒某个函数的事件信号 public delegate void ScoreChangeEventHandler (int newScore, ref bool cancel); //定义一个产生事件的类 public class Game { // 注意这里使用了event关键字 public event ScoreChangeEventHandler ScoreChange; int score; // Score 属性 public int Score { get { return score; } set { if (score != value) { bool cancel = false; ScoreChange (value, ref cancel); if (! cancel) score = value; } } } // 处理事件的类 public class Referee { public Referee (Game game) { // 裁判负责调整比赛中的分数变化 game.ScoreChange += new ScoreChangeEventHandler (game_ScoreChange); } // 注意这里的函数是怎样和ScoreChangeEventHandler的信号对上号的 private void game_ScoreChange (int newScore, ref bool cancel) { if (newScore &lt; 100) System.Console.WriteLine ("Good Score"); else { cancel = true; System.Console.WriteLine ("No Score can be that high!"); } } } // 主函数类,用于测试上述特性 public class GameTest { public static void Main () { Game game = new Game (); Referee referee = new Referee (game); game.Score = 70; game.Score = 110; } } 在主函数中,我们创建了一个game对象和一个裁判对象,然后我们通过改变比赛 分数,来观察裁判对此会有什么响应。 请注意,我们的这个系统中,Game对象是感觉不到裁判对象的存在的,Game对象 在这里只负责产生事件,至于有谁会来倾听这个事件,并为之作出反应,Game对象是 不作任何表态的。 我们注意到,在裁判类的Referee函数中,Game.ScoreChange后面使用了+=和-= 操作符,这是什么意思呢?回到我们定义ScoreChange的地方,可以发现ScoreChange 是用event关键字修饰的,那么这里的意思就很明白了:ScoreChange是一个事件,而 事件被触发后需要相应的事件处理机制,+=/-=就是为这个事件增加/移除相对应的事 件处理程序,而且,并不是一个事件只能对应一个处理程序,我们还可以用这两个操 作符为同一事件增加/移除数个事件处理程序。怎么样?很方便吧! 在实际应用中,和我们上面讲的(竞赛-裁判)机制很相近的系统就是图形用户 界面系统了。Game对象可以看作是图形界面上的小零件,而得分事件就相当于用户输 入事件,而裁判就相当于相应的应用程序,用于处理用户输入。 指代机制的首次亮相是在MSVJ里,它是由Anders Hejlsberg发明的,现在又用到 了C#中。指代用在Java语言中的后果,则直接导致了微软和Sun之间对类和指针的关 系产生了大量的争论和探讨。有意思的是,Java的发明者James Gosling非常幽默地称 呼指代的发明者Anders Hejlsberg为“‘函数指针’先生”,因为Anders Hejlsberg总是 想方设法地把指针变相地往各种语言中放;不过有人在看了Java中大量地使用了各种 类后,也戏称Java的发明者James Gosling为“‘全都是类’先生”,真是其中滋味, 尽在不言中啊 这两种语言之间无非是某些关键字不同,命名规则不同,还有程序库的不同。虽然这种说法不正确,我觉得这样理解可以更容易的掌握这两种语言。哈哈,转"行”更容易.

C#编码规范

clock 一月 23, 2011 09:58 by author alex
目标: 1. 安全:代码完成所需的功能之余,不要产生负作用,即要稳定可靠。 2. 易读: 类、实例、成员变量、成员函数的命名一目了然 3. 美观: 尽量统一项目组内人员的编程风格。 第一部分:命名 1. 命名原则 1) 所有的函数(变量/类/文件名)应该代表其实际的作用,应该使用有意义的单词或多个词组合,但不要使用人名、项目组名。 2) 所有的函数(变量/类名)一律使用英文。 3) 使用多个单词时不需要使用连线(如下划线), 但对于全部大写的宏需要使用连线。 4) 多个词组合较长时, 可以使用单词的缩写。 5) 不得使用非常相近的名字类表示几个不同含义的函数(变量/类)。 6) 命名时请考虑名字的唯一性和含义的准确性。 7) 使用项目组专用词汇来表达特定的含义(概念), 不得把专用词汇挪作他用。 2. 变量的命名 原则: 使用匈牙利命名法命名变量 1) 变量名一般由“类型修饰+代表变量含意的英文单词或单词缩写”等部分组成。 类型修饰(小写字母): n: int,l: LONG/long, s: short,u: UINT,f: float b: bool,by: BYTE,ch: char, sz: char[],str: string 2) 针对异常捕获过程中的 Exception 变量命名,在没有冲突的情况下,统一命名为 e;如果有冲突的情况下,可以重复 e,比如:ee。 3. 函数的命名 1) 使用动宾词组表达函数实际所作的事。 2) 同名的函数(重载函数)在功能上应该完全相同, 在参数上的差别也应一目了然。 3) 不得出现名字非常相近但功能不同的函数. 如 CreatePage1(), CreatePage2()等。 4. 类命名 1) 名字应该能够标识事物的特性。 2) 名字尽量不使用缩写,除非它是众所周知的。 3) 名字可以有两个或三个单词组成,但通常不应多于三个。 4) 在名字中,所有单词第一个字母大写,缩写都要大写。 5) 不要使用下划线字符 ( _ )。 5.控件命名规则 1) 控件命名=Web控件缩写前缀 + “_” +变量名 控件 Label TextBox Button ListBox DropDownList 等等 缩写 lb_XXX tb_XXX Btn_XXX Lb_XXX Drd_XXX XXXXX 6. 文件命名 1) 文件起名要有实际意义。 2) 源文件应尽量使用8.3格式,文件名只能包含字母、数字和下划线,不得使用其他的字母。超长的文件名应使用缩写方式减少文件名的长度。建议使用如下的缩写的规则(部分情况可以有例外,视具体情况而定): l 缩写一般可以去掉元音字母以及不发音字母 l 单词的首字母一般应该保留。 l 当一个单词必须缩成一个字母时,应该选用最有代表性的字母,或首字母。 l 多音节的单词可以去掉后面的音节而只保留前面的第一、二音节。较短的二音节单词一般不缩写,如果必须缩写,可以只保留一个字母 l 多个单词组成文件名时,应该保留较重要的有意义的单词(或多留几个字母),其他单词可以使用简写或只用首字母,去掉不必要的无意义的单词 l 可以使用一些谐音表示一个单词,如 2 表示to,4表示for等等,当单词数量少,字母少的情况下,不需要缩写 l 较短的单词一般不缩写,或缩写为一到二个字母 第二部分:代码格式书写规范 1.基本格式 1) 所有的缩进TAB键为 4 个空格,每个单词的首字符大写, 其余小写。 2) 在代码中垂直对齐左括号和右括号。例: if(x==0) { Response.Write("用户编号必须输入!"); } 不允许以下情况: if(x==0) { Response.Write("用户编号必须输入!");} 或者: if(x==0){Response.Write("用户编号必须输入!");} 3) 在大多数运算符之前和之后使用空格,这样做时不会改变代码的意图却可以使代码容易阅读。例:int j = i + k; 而不应写为: int j=i+k; 4) 编写 SQL 语句时,对于关键字使用全部大写,对于数据库元素(如表、列和视图)使用大小写混合。 5) 将每个主要的 SQL 子句放在不同的行上,这样更容易阅读和编辑语句。 2. 注释的写法 1) 在你劳神的地方请加上详细的注释说明。除了最简单的存取成员变量的Set_/Get_成员函数之外,其余大部分的函数写上注释是良好的习惯。尽量使你的程序让别人很容易看懂 2) 太多的注释会使程序很难看,但一些复杂的算法和数据结构处还是要加上注释的,这样别人就容易看懂。否则时间长了,你自己都未必看明白了. 3) 如果是对某一段程序(算法/结构)的注释, 在程序头直接用//再空一格来进行说明,一行不要超过80字符 4) 为了防止在阅读代码时不得不左右滚动源代码编辑器,每行代码或注释在不得超过一显示屏。 5) 使用连续的多个//表示注释行(不要超过80字符) 6) 文件头部应有注释,简单描述文件的内容 7) 对于程序中的比较关键的算法和函数,必须加注释 3.cs文件的书写 1) 各个部分应使用注释行和空行分割, 并在必要的地方写上注释 2) 函数之间用注释行和空行分割 3) 重要的函数在函数头部加上注释 4) { 和 }分别单独占用一行, 且上下对齐, 中间的内容缩进一个TAB 第三部分:其他 1. 变量 1) float和bool禁止用"=="判断。bool应该用逻辑运算关系符,而float应该用差值区间来判断“相等” 2) 类型转换一律用显式类型转换 3) 类型的长度一律用sizeof()获得 4) 当声明一个变量时,务必要自己初始化一下变量 2. 函数 1) 功能要单一,函数名要名符其实 2) 要易懂,实现时不要过分追求技巧,优化放到后面去做 3) 长度一般禁止超过200行 4) 要检查输入值是否合法。实现(成员)函数时务必要求输入参数是在要求范围之内,尤其你定义的(成员)函数给别人调用时,要判断其合法性。 5) 调用函数时要严格按照接口规范调用,调用后要判断执行情况,并做适当的错误处理(稍后会给出错误和异常处理规范)。 6) 尽量避免整块复制代码段,如果出现这样的情况要分析原因,如果这段代码完成独立的功能,应考虑使用函数,否则,应考虑使用宏定义。否则因为修改引起的不一致往往是错误的根源。 7) 除极其简单的函数外,其他的函数在入口处必须加上FMAT_TRACE(), 参见错误和异常处理规范。 8) 函数的出口尽量唯一,最好在出口处加上FMAT_TRACE() 9) 写代码时,尽量减少堆的分配次数,能使用Stack的尽量使用Stack 10) 函数编写必须精炼,消除冗余的代码,删除不用的变量 11) if/while等语句中的条件表达式的运算结果必须为显示的BOOL量 12) 禁止用goto语句

友情链接赞助