标签归档Visual Studio

“不要频繁获释对象”的略微随笔

【题外话】

前大部分岁月还在用Visual Studio
2008举行开发,虽然也接触起来过代码分析,但是同看无异老串内容,尤其是如出一辙生失误针对命名的提议,就坚决关闭了。这次见习使用的Visual
Studio
2012,发现代码分析默认去丢了多情节,显示的啊都是比较根本并欲改进的地方,所以啊都信以为真切磋了一晃。

 

【文章索引】

  1. 题材跟解决办法
  2. 胡这么去开
  3. 连锁链接

 

【一、问题和解决方式】

相应有人会写如下的代码吧,为了释放资源,我们把开拓的物还关门掉,貌似没有呀问题。

 1 FileStream fs = null;
 2 StreamReader sr = null;
 3 
 4 try
 5 {
 6     fs = new FileStream(@"F:\test.txt", FileMode.Open, FileAccess.Read);
 7     sr = new StreamReader(fs);
 8 
 9     String content = sr.ReadToEnd();
10 }
11 finally
12 {
13     if (sr != null)
14     {
15         sr.Close();
16     }
17 
18     if (fs != null)
19     {
20         fs.Close();
21     }
22 }

当,喜欢用using的校友也说不定会见写如下的代码:

1 using (FileStream fs = new FileStream(@"F:\test.txt", FileMode.Open, FileAccess.Read))
2 {
3     using (StreamReader sr = new StreamReader(fs))
4     {
5         String content = sr.ReadToEnd();
6     }
7 }

可是及时点儿种代码如果运用代码分析会起啊情况吗,如下图。

个人档案 1

于好玩的凡,这里提醒的是“不承诺本着一个目标往往调用
Dispose”,为什么会是“一个靶”呢?

由此阅读MSDN中之CA2202(链接以文后),我们得以查及由是这般的,“某个方法实现所涵盖的代码路径可能引致对平对象往往调用
IDisposable.Dispose 或与 Dispose 等效的章程(例如,用于某些品种的
Close()
方法)”,MSDN中一直给来了缓解措施就是是绝不关StreamReader,而是直接关闭FileStream。

 

【二、为什么如此夺做】

MSDN给来之不二法门为什么要如此做也?出于好奇心,首先以上述的代码单步调试一下:

个人档案 2

当履完毕StreamReader的Close之后,StreamReader的BaseStream指向了null,同时fs也变成了不可知读取,但fs不是null。

下一场我们之所以Reflector找到StreamReader的落实(在mscorlib.dll文件被)如下:

 1 public override void Close()
 2 {
 3     this.Dispose(true);
 4 }
 5 
 6 protected override void Dispose(bool disposing)
 7 {
 8     try
 9     {
10         if ((this.Closable && disposing) && (this.stream != null))
11         {
12             this.stream.Close();
13         }
14     }
15     finally
16     {
17         if (this.Closable && (this.stream != null))
18         {
19             this.stream = null;
20             this.encoding = null;
21             this.decoder = null;
22             this.byteBuffer = null;
23             this.charBuffer = null;
24             this.charPos = 0;
25             this.charLen = 0;
26             base.Dispose(disposing);
27         }
28     }
29 }

StreamReader在履Close时竟然执行了this.stream(BaseStream)的Close,然后将BaseStream再针对null,这就算解决了之前为什么提示不要频繁获释
一个
对象,其实是StreamReader的Close已经出狱了一致次等而已。当然,不仅仅是StreamReader个人档案是这样子,StreamWriter、BinaryReader等等也都是这样子的。

可,为什么MSDN的事例让的凡关门流一旦无是关门读取器呢?

阅读了网上也尚无找到权威的素材,所以个人总结了几乎点如下仅供参考:

1、关闭StreamReader等其实已经关门了那个BaseStream,但爱使开发者误以为BaseStream没有关而延续利用导致抛来十分,所以关闭最基础的流会更好把。

2、StreamReader等自己并没有运用非托管的情节,所以啊不管需积极履行Close,让GC去做就哼了。

 

【三、相关链接】

1、CA2202:不要反复纵对象:http://msdn.microsoft.com/zh-cn/library/ms182334(v=vs.110).aspx

澳门新葡亰官网Visual Studio 2017各级版安装包离线下载、安装全解析

有关Visual Studio
2017列版本安装包离线下载、更新和装置之章程与经过已生充斥版本减少下载量的方

微软多年来揭晓了业内版Visual Studio
2017连明白了其下载方式,不过出于VS2017采用了新的模块化安装方案,所以微软官方并未提供ISO镜像,但是官方提供了争进行离线下载的方案为要开展离线安装的用户,只不过都是英文。本文将本着官方指南中的相同局部进行翻译(这里说一样句子:翻译的一部分即是最为基础的离线下载和安方案,另外,即使要先微软资了安装镜像,也特会包含Visual
Studio的中心核心组件和有法定扩展,而微软、安卓与苹果等平台的SDK、模拟器和老三正在扩大功能等会于用户挑选后联网下载。而VS2017底离线包是含有可选取之)。好了,接下去将见面分为四有些来描述,分别是离线下载安装文件、离线安装VS2017、更新离线文件管以及哪些通过就下载版本来减少下充斥其它版本下载量的艺术。

率先片段:离线下载安装文件

此描述是连持有版本,截图以下载VS2017社区本为例:

①刊登入VS官网下载页面,选择要之版点击下载,下载页点此进入。

②生充斥完成后,打开下载文件所在文件夹,Windows
8.1以及以上版本用户点击资源管理器上的文书-打开命令提示符-以管理人身份打开命令提示符;Windows7用户可每当拖欠公文夹空白处按停Shift键的情事下点冲击鼠标右键选择“在这边打开命令窗口”。

澳门新葡亰官网 1

③基于自己下载的VS2017本子,在开辟的命令提示符窗口输入下面对应之通令并点击回车,等待程序启动即会开始下载(以下命令用于下载完整版离线包,包含全效与全语言包,其中红色部分为下载文件存放路径,根据本人状态用户可自动转移)

企业版

vs_enterprise.exe –layout c:\vs2017offline

专业版

vs_professional.exe –layout c:\vs2017offline

社区版

vs_community.exe –layout c:\vs2017offline

澳门新葡亰官网 2

使需要下载单一语言的还是内部之一几乎栽语言的离线文件,可采用以下命令:

企业版:vs_enterprise.exe –layout c:\vs2017offline –lang zh-CN

专业版:vs_professional.exe –layout c:\vs2017offline –lang zh-CN

社区版:vs_community.exe –layout c:\vs2017offline –lang zh-CN

辛亥革命代码为语言参数,这里提供三种植语言的参数供大家选择

英语(美国):en-US

中文:zh-CN(简体),zh-TW(繁体)

日语:ja-JP

假若欲以下载多种语言,可以于–lang后面连续增长多独语言代码参数,用空格间隔开就行,比如—lang
en-US zh-CN ja-JP,那么即使见面同时下载英文、中文和日文语言包。

④假设得再次多语言包或另行多设置指令,请参见官方离线安装命令指南:点此进入。

⑤等待文件下载,不要关文件下充斥窗口,等具有文件下充斥完成后该窗口会活动关闭,下载过程中毫无断电断网,也不要关窗口,当然,苟断电断网或者关闭了下载窗口,没提到,输入指令重头来了,还是会持续下载的

澳门新葡亰官网 3

其次局部:离线安装

准有的为安社区本为例,其他版本安装过程同样,只是专业版和供销社版欲激活授权

①打开刚刚存放离线文件的路,比如E:\vs2017offline,然后找到certificates文件夹并打开,依次安装该文件夹下之软件证书。双击证书并根据提示为下移动就是实行了,实在无心弄就直下一致步直到提示导入成功。

澳门新葡亰官网 4

澳门新葡亰官网 5

②运作离线根目录下之安装程序,各版位置如下:

合作社版:离线文件存储文件夹\vs_Enterprise.exe

专业版:离线文件存储文件夹\vs_Professional.exe

社区本:离线文件存储文件夹\vs_Community.exe

③安装程序运行后,选择自己索要之模块和法力,确认所需要后点击安装即可。顺便吐槽一下,社区版全工作负荷、全组件和全语言包选择后需空间93.85GB,所以大家还是选择自己需要之安装就执行了……另外,需要Python扩展支持之心上人,可以好生载Python安装,或者安装好后自行到扩张添加,官方安装文件对Python扩展的带有据说只要当下次翻新……

澳门新葡亰官网 6

澳门新葡亰官网 7

④等候安装到位即可使了。

老三片段:更新离线文件管

即时一部分比较简单,步骤如下:

①当微软提示有本更新后,到官网下载最新的在线安装执行文书,下载地址:点此进入。

②依步骤执行本文第一片段下载离线安装文件的手续,但是要小心,–layout后底下载文件夹路径必须是原始本子离线文件存储的职(如果您前面下充斥好未尝倒过那么即便是之前的下载路径),执行命令后安装程序会扫描都发生文件并下载更新文件与新增文件。

③创新得后而重新实施离线文件夹根目录下的安装程序进行软件更新,或者VS中一直检查更新,更新新本子理论及随便需更导入证书除非有新证被下载。

季有:通过已下充斥版本澳门新葡亰官网减少其他版本离线下载量

马上片为格外粗略,原理就是是社区本、专业版和店版有大部分组件其实是相同,如果用户想离开线下充斥具版本,那么没充分必要,企业版包含了任何具有版本的组件,所以理论及用户只用下载企业版即可,安装时凡可挑选安装社区本、专业版或者商店版的。当然目前前所陈述只是理论,毕竟我莫试,当然以下方法可以百分百包得之用户之所以最少的下载量完成下载所有版本的VS2017。

若你曾经下充斥好了内同样本子,均只是进行如下操作:

①创建两个新文件夹,根据你自己之欢喜重命名,最好是英文称。

②以已经下好之本子的持有文件还分别复制到即简单个新文件夹着,并剔除由事先下载程序下载在干净目录下之六只公文。

澳门新葡亰官网 8

③下蛋充斥另外两个本子的安装程序,接下去便再第一片的步调,但是指令行命令—layout后底门径参数根据本分别安装为你碰巧新建的那片只文本夹。

④磨车执行命令,程序会扫描与检讨已经下载的零件,并于今自己版本对应的亏的和匹配的零部件,不过即有的分寸不会见跨1GB,准确来说或许不过出几十主左右……

⑤等待完成,反正不一会儿就是哼了,然后就是足以收藏三只本子的离开线包了。

⑥至于更新嘛,参见第三部分。

第五部分:附加

当时有也是增大的相同片段,信息是一点一滴下载(包含全效全语言包)的社区本和商家版的详细文件信息,以及她们之差集文件夹信息;最老的凡店版,最小之是公司版和社区本文件夹差集的音。最后便,各版离线包里面足足含有以下重点字之公文夹着之始末是完全一样模型一样的,就是:SDK、.NET、Xamarin、Unity、Cocos、Unreal、Linux、Mac、iOS、Android、emulator……包含这些关键词的文件夹,大小合计应过16GB了……

澳门新葡亰官网 9

澳门新葡亰官网 10

澳门新葡亰官网 11

末尾嘛就是,学习编程是长达大坏痛苦和马拉松的路程啊,它并未我们想像的那粗略,因为实际你要效仿的事物并无仅仅只是编写代码……当然学习也是喜欢的,每当克一个难题带来的成就感总会驱使而继续向更胜之完结努力~~

VS2015 安装nuget离线包nupkg文件

多年来当开项目进度管理时,想透过设置net.sf.mpxj-for-csharp包读取.mpp格式文件,通过Nuget在线安装时,出现以下情形,无法安装,故被离线安装道路。

 

离线安装步骤如下:

平、下充斥而需要装之离线包nupkg文件,可以当Nuget官网下载:https://www.nuget.org/packages

图片 1

仲、修改Nuget程序包源:VS>工具》选项》Nuget包管理器》程序包源,如图,将下载的nupkg文件放在C:\Program
Files (x86)\Microsoft SDKs\NuGetPackages\路径下:

图片 2

老三、如下图,选择离线包源,左侧“浏览”选项卡下就可以看见,你一旦装的保管,点击安装即可。

图片 3

 

Roslyn导致发布网站经常报错:编译失败

日前新提升了Visual Studio
2017,创建的Web项目Bin目录中大多了一个受roslyn的公文夹,该文件夹导致网站以少数服务器上揭晓出错

澳门新葡亰官网 1

 

自网上搜索了一下,Roslyn是初发生的动态编译工具

澳门新葡亰官网 2

 

可于服务器上安装.net4.6后还提示编译出错。

解决方式:打开解决方案NuGet包管理器,卸载一个被“Microsoft.CodeDom.Providers.DotNetCom澳门新葡亰官网pilerPlatform”的保管,之后又编译网站,发现Bin目录下并未roslyn文件夹了!

用Visual Studio Code和typescript 开发调试React Native项目

关于React Native的详细介绍自身就非叙述了,他是动js构建原生app的出框架。一不行变编码多平台运行,非常强大。但是个人不喜欢js的超负荷灵活(弱类型)的语法。强大的强类型语言Typescript(简称TS)大凡自身之首选,他可编译成JavaScript,编译成的JavaScript代码可读性很好,但是及时不是重中之重,关键是TS开以及调试效率极高。
但是React Native合法是用js的支出之,如果要是利用TS开发React
Native的显要是transformer
eact-native结合的首要是下转换器

初始化项目

react-native init YahuiApp
cd YahuiApp
yarn add –dev react-native-typescript-transformer typescript
@types/react @types/react-native

为此vscode打开 添加配置文件

配置Typescript

新建文件 tsconfig.json内容为

{
    "compilerOptions": {
        "module": "es2015",
        "target": "es2015",
        "moduleResolution": "node",
        "jsx": "react-native",
        "noImplicitAny": true,
        "experimentalDecorators": true,
        "preserveConstEnums": true,
        "sourceMap": true,
        "watch": true,
        "allowSyntheticDefaultImports": true
    },
    "filesGlob": [
        "src/**/*.ts",
        "src/**/*.tsx"
    ],
    "exclude": [
        "index.android.js",
        "index.ios.js",
        "build",
        "node_modules"
    ]
}

新建文件 tslint.json 内容为

{
    "rules": {
        "class-name": false,
        "comment-format": [
            true,
            "check-space"
        ],
        "indent": [
            true,
            "spaces"
        ],
        "no-duplicate-variable": true,
        "no-eval": true,
        "no-internal-module": true,
        "no-trailing-whitespace": true,
        "no-unsafe-finally": true,
        "no-var-keyword": true,
        "one-line": [
            true,
            "check-open-brace",
            "check-whitespace"
        ],
        "quotemark": [
            true,
            "double"
        ],
        "semicolon": [
            true,
            "always"
        ],
        "triple-equals": [
            true,
            "allow-null-check"
        ],
        "typedef-whitespace": [
            true,
            {
                "call-signature": "nospace",
                "index-signature": "nospace",
                "parameter": "nospace",
                "property-declaration": "nospace",
                "variable-declaration": "nospace"
            }
        ],
        "variable-name": [
            true,
            "ban-keywords"
        ],
        "whitespace": [
            true,
            "check-branch",
            "check-decl",
            "check-operator",
            "check-separator",
            "check-type"
        ]
    }
}

配置React Native Packager

绝望目录新建rn-cli.config.js文件 内容吧:
module.exports = {
getTransformModulePath() {
return require.resolve(‘react-native-typescript-transformer’);
},
getSourceExts() {
return [ ‘ts’, ‘tsx’ ]
}
};

编写代码

以 src文件夹里新建main.tsc文件
代码为:

import React, { Component } from "react";
import {
    StyleSheet,
    Text,
    View
} from "react-native";
interface Props {

}
interface State {

}
export default class App extends Component<Props, State> {
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.text}>
                    Welcome to React Native!
                </Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: "center",
        alignItems: "center",
        backgroundColor: "#F5FCFF",
    } as React.ViewStyle,

    text: {
        fontSize: 20,
        textAlign: "center",
        margin: 10,
    } as React.TextStyle,
});

AppRegistry

import {
    AppRegistry,
} from 'react-native';
import App from "./src/main";

AppRegistry.registerComponent('YahuiApp', () => App);

时至今日 您的运用TS开发React Native的项目环境多建筑好了

张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )

  所谓 UWP 样式的汉堡菜单,我早就以“张高兴的 UWP
开发笔记:汉堡菜单进阶”里说过,也就是利用
Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色之矩形用来表示
ListView 的挑选着。如下图

个人档案 1

  但什么通过 Xamarin.Forms ,将立刻同样式的汉堡菜单带入到 Android 与 iOS
中为?

 

  一如既往、大纲-细节模式简介

  说代码前先是来说说这种导航模式,官方称“大纲-细节模式”(MasterDetail)。左侧的汉堡菜单称为“大纲”(Master),右侧的页面称为“细节”(Detail)。Xamarin.Froms
为品种提供了多种植导航模式,“大纲-细节”为内部同样种。

 

  仲、项目简介

  效果图:

个人档案 2

  不多说废话,看代码实在些。

  本示例是采取 Visual Studio 2017 创建的 Cross-Platform
项目,项目名为也”HamburgerMenuDemo“,模板也空白项目。(GitHub:https://github.com/ZhangGaoxing/xamarin-forms-demo/tree/master/HamburgerMenuDemo)

个人档案 3

  待项目创造好后,解决方案并包含四只类别:共享代码项目、 Android
项目、 iOS 项目、 UWP
项目。共享代码项目也寄放共享页面的地方,个人认为和类库还是来接触分之。

个人档案 4

  

  老三、共享代码项目
HamburgerMenuDemo 

  首先补充加几只页面,根目录下上加一个 MasterPage.xaml
页面,用于”大纲视图“。添加一个 Views
文件夹,用于存放子页面,向中添加3只界面:Page1、Page2、Page3。添加一个 MasterPageItem.cs
类。

  1. MasterPageItem.cs

  和 UWP 的汉堡菜单一样,首先使创建一个近乎,作为导航的类,用来绑定
ListView 。名字被 MasterPageItem.cs 。

  里面的性有页面的题 Title,左侧的图标 Icon,图标的字体
FontFamily,目的页面 DestPage,还有左侧的矩形显示 Selected 与 颜色
Color。由于要促成双向绑定,还要落实接口 INotifyPropertyChanged。要顾的是,Color
类型为 Xamarin.Forms 中的。

代码如下

public class MasterPageItem : INotifyPropertyChanged
{
    // 字体路径,用于引入 Segoe MDL2 Assets 字体
    public string FontFamily { get; set; }

    // 字体图标转义
    public string Icon { get; set; }

    // 标题
    public string Title { get; set; }

    // 目的页
    public Type DestPage { get; set; }

    // 用于显示左侧填充矩形,双向绑定
    private bool selected = false;
    public bool Selected
    {
        get { return selected; }
        set
        {
            selected = value;
            this.OnPropertyChanged("Selected");
        }
    }

    // 选中颜色,双向绑定 ( using Xamarin.Forms )
    private Color color = new Color();
    public Color Color
    {
        get { return color; }
        set
        {
            color = value;
            this.OnPropertyChanged("Color");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

  2. MasterPage.xaml

  MasterPage 也”大纲“视图,即左侧展示 ListView
的页面。本档之 MasterPage 分为两苑,分一级菜单和二级菜单,即置顶一个
ListView 与置底一个 ListView 。 ListView 的 ItemTemplate 与 UWP
稍有两样,左侧的填充矩形换成了 BoxView,二级菜单的头线由 Border
换成了冲天也1底 BoxView。代码如下

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="HamburgerMenuDemo.MasterPage"
             Icon="hamburger.png"
             Title=" ">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="1" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <!--一级菜单-->
        <ListView x:Name="PrimaryListView" VerticalOptions="StartAndExpand" SeparatorVisibility="None">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid HeightRequest="48">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="48"/>
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>

                            <BoxView BackgroundColor="{Binding Color}" WidthRequest="5" HeightRequest="26" HorizontalOptions="Start" VerticalOptions="Center" IsVisible="{Binding Selected}" />
                            <Label Text="{Binding Icon}" FontFamily="{Binding FontFamily}" TextColor="{Binding Color}" FontSize="16" HorizontalOptions="Center" VerticalOptions="Center" />
                            <Label Grid.Column="1" Text="{Binding Title}" TextColor="{Binding Color}" FontSize="14" VerticalOptions="Center" />
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <!--BoxView 充当 Border-->
        <BoxView BackgroundColor="Gray" Grid.Row="1" HorizontalOptions="FillAndExpand" />

        <!--二级菜单-->
        <ListView x:Name="SecondaryListView" Grid.Row="2" VerticalOptions="End" SeparatorVisibility="None" Margin="0,-6,0,0">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid HeightRequest="48">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="48"/>
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>

                            <BoxView BackgroundColor="{Binding Color}" WidthRequest="5" HeightRequest="26" HorizontalOptions="Start" VerticalOptions="Center" IsVisible="{Binding Selected}" />
                            <Label x:Name="IconLabel" Text="{Binding Icon}" FontFamily="{Binding FontFamily}" TextColor="{Binding Color}" FontSize="16" HorizontalOptions="Center" VerticalOptions="Center" />
                            <Label Grid.Column="1" Text="{Binding Title}" TextColor="{Binding Color}" FontSize="14" VerticalOptions="Center" />
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</ContentPage>

  MasterPage.xaml.cs 代码也要开口下,不知是怎么回事,以上 Xaml
代码直接运行时有限独菜单会显得不正规,只展示一个菜系,<RowDefinition
Height=”Auto” /> 在斯 ContentPage
里好像无效。因此自于后台代码设置了二级菜单的莫大,也就是48 *
secondaryItems.Count。两只 ListView 需要经过性能的主意,向 MainPage
传递控件。字体路径各个品类不同,需要独自设置,我后会说。MasterPage.xaml.cs
代码如下

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MasterPage : ContentPage
{
    // 向 MainPage 传递控件
    public ListView primaryListView { get { return PrimaryListView; } }
    public ListView secondaryListView { get { return SecondaryListView; } }

    public MasterPage()
    {
        InitializeComponent();

        // 设置不同平台的字体路径
        string fontFamily;
        switch (Device.RuntimePlatform)
        {
            case "Android":
                fontFamily = "segmdl2.ttf#Segoe MDL2 Assets";
                break;

            case "iOS":
                fontFamily = "Segoe MDL2 Assets";
                break;

            case "Windows":
                fontFamily = "/Assets/segmdl2.ttf#Segoe MDL2 Assets";
                break;

            case "WinPhone":
                fontFamily = "/Assets/segmdl2.ttf#Segoe MDL2 Assets";
                break;

            default:
                fontFamily = "segmdl2.ttf#Segoe MDL2 Assets";
                break;
        }

        // 列表项
        var primaryItems = new List<MasterPageItem>() {
                new MasterPageItem
                {
                    Title = "Page1",
                    FontFamily = fontFamily,
                    Icon = "\xE10F",
                    Color = Color.DeepSkyBlue,
                    Selected = true,
                    DestPage = typeof(Page1)
                },
                new MasterPageItem
                {
                    Title = "Page2",
                    FontFamily = fontFamily,
                    Icon = "\xE11F",
                    Color = Color.Black,
                    Selected = false,
                    DestPage = typeof(Page2)
                },
                new MasterPageItem
                {
                    Title = "Page3",
                    FontFamily = fontFamily,
                    Icon = "\xE12F",
                    Color = Color.Black,
                    Selected = false,
                    DestPage = typeof(Page2)
                }
            };

        var secondaryItems = new List<MasterPageItem>() {
                new MasterPageItem
                {
                    Title = "设置",
                    FontFamily = fontFamily,
                    Icon = "\xE713",
                    Color = Color.Black,
                    Selected = false,
                    DestPage = typeof(SettingPage)
                },
                new MasterPageItem
                {
                    Title = "关于",
                    FontFamily = fontFamily,
                    Icon = "\xE783",
                    Color = Color.Black,
                    Selected = false,
                    DestPage = typeof(AboutPage)
                }
            };

        // ListView 数据绑定
        PrimaryListView.ItemsSource = primaryItems;
        SecondaryListView.ItemsSource = secondaryItems;

        // 设置二级菜单高度
        SecondaryListView.HeightRequest = 48 * secondaryItems.Count;
    }
}

  3. MainPage.xaml

  下面来修改一下 MainPage.xaml 。MainPage.xaml 为使用的进口页面,可于
App.xaml.cs 中改。将 MainPage 中的根元素替换为 MasterDetailPage
。注释很详细,不多说了

<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:HamburgerMenuDemo"
             x:Class="HamburgerMenuDemo.MainPage"
             xmlns:views="clr-namespace:HamburgerMenuDemo.Views">

    <!--大纲视图-->
    <MasterDetailPage.Master>
        <!--引入 MasterPage 并给个名称,用于后台设置 MasterPage 传递过来的 ListView-->
        <local:MasterPage x:Name="masterPage" />
    </MasterDetailPage.Master>

    <!--细节视图-->
    <MasterDetailPage.Detail>
        <NavigationPage>
            <x:Arguments>
                <!--默认显示的页面-->
                <views:Page1 />
            </x:Arguments>
        </NavigationPage>
    </MasterDetailPage.Detail>

</MasterDetailPage>

  同样的 MainPage.xaml.cs 中之代码也不行简短,注释很详细

public MainPage()
{
    InitializeComponent();

    // ListView 点击事件
    masterPage.primaryListView.ItemSelected += MasterPageItemSelected;
    masterPage.secondaryListView.ItemSelected += MasterPageItemSelected;

    // 设置 Windows 平台的“大纲”显示模式为折叠
    if (Device.RuntimePlatform == Device.Windows)
    {
        MasterBehavior = MasterBehavior.Popover;
    }
}

private void MasterPageItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    var item = e.SelectedItem as MasterPageItem;

    if (item != null)
    {
        // 遍历 ListView 数据源,将选中项矩形显示,字体颜色设置成未选中
        foreach (MasterPageItem mpi in masterPage.primaryListView.ItemsSource)
        {
            mpi.Selected = false;
            mpi.Color = Color.Black;
        }
        foreach (MasterPageItem mpi in masterPage.secondaryListView.ItemsSource)
        {
            mpi.Selected = false;
            mpi.Color = Color.Black;
        }

        // 设置选中项
        item.Selected = true;
        item.Color = Color.DeepSkyBlue;

        // 跳转
        Detail = new NavigationPage((Page)Activator.CreateInstance(item.DestPage));

        // 取消 ListView 默认选中样式
        masterPage.primaryListView.SelectedItem = null;
        masterPage.secondaryListView.SelectedItem = null;

        // 关闭“大纲”
        IsPresented = false;
    }
}

  要留意的是 MasterPage.xaml 页面被的 Title
一定要是让,要不然会报错,可以以后台 cs 文件被修改 Title 属性,也堪在
Xaml 根元素中改 Title。Views 中之几乎独页面 Title
不受得,但标题栏不会见显示页面的 Title,不好看。

 

  四、Android
项目 HamburgerMenuDemo.Android

  1. 字设置

  将 segmdl2.ttf 字体文件一直放入 Assets 文件夹下即可

  2. 修改 style.xml

  ”大纲“的默认效果是 DrawerLayout
覆盖状态栏的,不绝好看,需要改样式个人档案。在 style.xml 中补充加

<item name="android:fitsSystemWindows">true</item>

  同时,由于修改了体制,变成了状态栏覆盖 DrawerLayout
,需要让 MasterPage.xaml 中之根 Grid 赋值一个 Padding=”0,25,0,-6″,但
UWP 项目却休需,这点我会在文末给起代码。

 

  五、iOS
项目 HamburgerMenuDemo.iOS

  1. 字设置

  弄了长远,Xamarin 太坑了,plist 的编辑器很不调和。。。

  (1)将 segmdl2.ttf 字体文件直接放入 Resources 文件夹

  (2)更改 segmdl2.ttf 属性,复制到输出目录 =》 始终复制,生成操作
=》 BundleResource

  (2)不要双击,右击 Info.plist ,查看代码,添加如下内容

<dict>
    <key>UIAppFonts</key>
    <array>
      <string>segmdl2.ttf</string>
    </array>
  </dict>

  如果如补偿加任何的资源,可以好新建一个 .plist
文件,新建的文件是例行显示资源列表的,添加完成后,复制代码到 Info.plist
即可。

  2. Padding

  和安卓平等,需要吃 MasterPage.xaml 中之根 Grid 赋值一个
Padding=”0,20,0,-6″,我会在文末给起代码。

 

  六、Padding 代码

  在 MasterPage.xaml 添加如下代码

<!--安卓空出状态栏的宽度-->
<ContentPage.Resources>
    <ResourceDictionary>
        <OnPlatform x:Key="padding"
              x:TypeArguments="Thickness"
              iOS="0,20,0,-6"
              Android="0,25,0,-6"
              WinPhone="0" />
    </ResourceDictionary>
</ContentPage.Resources>

  别忘了于 Grid 中援引资源

Padding="{StaticResource padding}"

  MasterPage.xaml 最终代码

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="HamburgerMenuDemo.MasterPage"
             Icon="hamburger.png"
             Title=" ">

    <!--安卓空出状态栏的宽度-->
    <ContentPage.Resources>
        <ResourceDictionary>
            <OnPlatform x:Key="padding"
                  x:TypeArguments="Thickness"
                  iOS="0,20,0,0"
                  Android="0,20,0,0"
                  WinPhone="0" />
        </ResourceDictionary>
    </ContentPage.Resources>

    <Grid Padding="{StaticResource padding}">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="1" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <!--一级菜单-->
        <ListView x:Name="PrimaryListView" VerticalOptions="StartAndExpand" SeparatorVisibility="None">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid HeightRequest="48">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="48"/>
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>

                            <BoxView BackgroundColor="{Binding Color}" WidthRequest="5" HeightRequest="26" HorizontalOptions="Start" VerticalOptions="Center" IsVisible="{Binding Selected}" />
                            <Label Text="{Binding Icon}" FontFamily="{Binding FontFamily}" TextColor="{Binding Color}" FontSize="16" HorizontalOptions="Center" VerticalOptions="Center" />
                            <Label Grid.Column="1" Text="{Binding Title}" TextColor="{Binding Color}" FontSize="14" VerticalOptions="Center" />
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <!--BoxView 充当 Border-->
        <BoxView BackgroundColor="Gray" Grid.Row="1" HorizontalOptions="FillAndExpand" />

        <!--二级菜单-->
        <ListView x:Name="SecondaryListView" Grid.Row="2" VerticalOptions="End" SeparatorVisibility="None" Margin="0,-6,0,0">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid HeightRequest="48">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="48"/>
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>

                            <BoxView BackgroundColor="{Binding Color}" WidthRequest="5" HeightRequest="26" HorizontalOptions="Start" VerticalOptions="Center" IsVisible="{Binding Selected}" />
                            <Label x:Name="IconLabel" Text="{Binding Icon}" FontFamily="{Binding FontFamily}" TextColor="{Binding Color}" FontSize="16" HorizontalOptions="Center" VerticalOptions="Center" />
                            <Label Grid.Column="1" Text="{Binding Title}" TextColor="{Binding Color}" FontSize="14" VerticalOptions="Center" />
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</ContentPage>

 

澳门新葡亰官网搭建好的NuGet服务器

  前言:发了NuGet引用什么的管制起方便多了,特别是团队合作之上,但是于使用过程中发现于远程还原包的时段真的是齐及花都谢了,没道,只好自己作个NuGet服务器。

  —————我是分割线————

  废话少说,开始正题:

  一、部署NugetServer

    1、新建一个空的web项目(这里.NET
Framework版本选了4.6凡坐生一致步之NuGet.Server包最新稳定版3.0.0准赖.NET
Framework 4.6)

    澳门新葡亰官网 1

    澳门新葡亰官网 2

    2、为项目添加NuGet.Server包

    澳门新葡亰官网 3

     3、将网站公布到服务器的IIS上去,访问该网站会看以下内容就认证部署成功了

    澳门新葡亰官网 4

    备注:第一独地点便是包源的地址,vs配置时即需要它,第二单上传包用的,具体科目请参见其他博客吧,有诸多方式,注意一点,如果不思量用APIKey,可以于布局文件中置为false。

  亚、配置vs中NuGet引用路径(工具–>选项–>NuGet包管理器–>程序包源)

    澳门新葡亰官网 5

  澳门新葡亰官网  这样以后下充斥包就足以切换至祥和之服务器了

    澳门新葡亰官网 6

澳门新葡亰官网.NET Core快速入门教程 5、使用VS Code进行C#代码调试之技术

一、前言

  • 缘何要调节代码?
    经调试好让咱们询问代码运行过程遭到之代码执行信息,比如变量的值等等。
    普普通通调试代码是以方便我们发现代码中的bug。ken.io以为熟练代码调试技巧是成合格程序员的为主要求。

  • 本篇开发条件
    1、操作系统: Windows 10 X64
    2、SDK: .NET Core 2.0 Preview
    3、IDE:VS Code 1.14

其次、调试技巧

  • 装断点

以代码编辑区域,点击左边代码行行号的左边,即可在该行设置断点

澳门新葡亰官网 1

  • 开行调试

应用菜单:调试->启动调试,或者下快捷键F5起动调试

澳门新葡亰官网 2

启航调试后,程序启动,并会留于率先个断点这一行。且这行的代码并未实施。
VS Code会自动唤出Debug工作区,本文将日益介绍常用功能。

  • Debug工作区介绍

1、顶部Debug工具栏

按钮&快捷键 说明(ken.io的翻译)
绿色向右箭头(F5) 继续执行程序,如果遇到断点则会停留到该断点
蓝色向右箭头(F10) 单步跳过:执行一条语句,但是遇到方法调用时不进入,直到方法执行完成后直接继续。
蓝色向下箭头(F11) 单步调试:执行一条语句,遇到方法调用时会进入方法进行调试
蓝色向上箭头(Shift+F11) 单步跳出:执行当前当前方法并到下一步骤,如果当前方法有断点则会到下一个断点
绿色环形箭头(Ctrl+Shift+F5) 重新启动调试
红色方块(Shift+F5) 停止调试

2、变量区域

管理即法就宣示的变量信息

澳门新葡亰官网 3

3、监视

好加上要监视的表达式,比如i*2+5

澳门新葡亰官网 4

如果i的价发生变化,将见面实时计算结果

4、调用堆栈

显示当前调试的库房信息

澳门新葡亰官网 5

说明(ken.io的翻译)
heelodotnet.dll 调用的动态链接库
hellodotnet 命名空间
Program.Main(string[] args) 调用的类&方法
Line 当前调用方法的行号

设发生多单调用的链接库可以鼠标单击切换。查看变量等消息

5、断点

管住断点

澳门新葡亰官网 6

  • 调节过程遭到改变量

入选要改的标量,鼠标右键->设置值(快捷键F2也足以)

澳门新葡亰官网 7

设置值:

澳门新葡亰官网 8

拨车键保存,然后F10进行单步跳了

澳门新葡亰官网 9

理所当然i=0,randomNum=28,如果继续执行result=false,将无法实施if语句块。
改后randomNum=0,执行后result=true,让本会吃超越了之if语句块可以为调剂。

老三、VS Code调试 .NET Core快捷键总结

快捷键 说明(ken.io的翻译)
快捷键:F5 继续执行程序,如果遇到断点则会停留到该断点
快捷键:F10 单步跳过:执行一条语句,但是遇到方法调用时不进入,直到方法执行完成后直接继续。
快捷键:F11 单步调试:执行一条语句,遇到方法调用时会进入方法进行调试
快捷键:Shift+F11 单步跳出:执行当前当前方法并到下一步骤,如果当前方法有断点则会到下一个断点
快捷键:Ctrl+Shift+F5 重新启动调试
快捷键:Shift+F5 停止调试
快捷键:F9 切换断点:跳到下一个断点
快捷键:Shift+F9 列断点:在当前光标的下一行增加一个断点

  • 铺天盖地号:.NET Core
    快速入门教程
  • 上一篇:.NET Core快速入门教程 4、使用VS Code开发.NET
    Core控制台应用程序
  • 产同样篇:澳门新葡亰官网暂无下同样首,敬请期待!
  • 本篇首不善公布:2017-08-01
  • 本篇原文链接:https://ken.io/note/dotnet-core-qucikstart-debug-vscode-skill

本文由 ken.io 创作,采用CC BY 3.0
CN协议 进行许可。
可任意转载、引用、甚至修改,但用签署作者都注明出处。

VS 2015调试状态下,用IP访问提示:Bad Request – Invalid Hostname

化解办法如下:

1、在状态栏中,选择IISPress站点,右键选择显示所有应用程序

澳门新葡亰官网 1

2、选中你需要修改的站点,点击最下方配置后面的路径地址,打开applicationhost.config文件,找到需要修改的站点,添加红色矩形框内容,并以革命椭圆框内修改为好的IP地址。

澳门新葡亰官网 2

 

澳门新葡亰官网 3

3、关闭vs 2015,并因管理人身份运行vs
2015。(注:一定要是为管理人身份运行vs
2015,否则用IP澳门新葡亰官网地址访问,依然是一样错误)

 

体检套餐管理网 — Dictionary双列集合

本文章为 Dictionary<K,V>双列集合开发项目,如用List<T>单列集合开发之这路,请到楼主博客园寻找

博客网址:http://www.cnblogs.com/lsy131479/

 

窗体

      图片 1

 

 

一.首先创建项目类

 public class HealthCheckItem
    {
        //项目描述
        private string description;
        //项目名称
        private string name;
        //项目价格
        private int price;

        //无参构造
        public HealthCheckItem()
        {
        }

        //有参构造
        public HealthCheckItem(string description, string name, int price)
        {
            this.description = description;
            this.name = name;
            this.price = price;
        }

        public string Description { get => description; set => description = value; }
        public string Name { get => name; set => name = value; }
        public int Price { get => price; set => price = value; }
    }

二.开立套餐类

/// <summary>
    /// 套餐类
    /// </summary>
   public class HealthCheckSet
    {
        //套餐名
        private string name;
        //套餐总价格
        private int price;
        //存储套餐内的项目
         private Dictionary<string, HealthCheckItem> items = new Dictionary<string, HealthCheckItem>();

        //无参构造
        public HealthCheckSet()
        {
        }
        //有参构造
        public HealthCheckSet(string name)
        {
            this.name = name;

        }



        public string Name { get => name; set => name = value; }
        public int Price { get => price; set => price = value; }
        public Dictionary<string, HealthCheckItem>{ get => items; set => items = value; }
    }

 

三.主窗体代码

   /// <summary>
    /// 体检套餐管理系统 -- Dictionary<K,V>双列集合
    /// </summary>
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            //删除多余列
            this.dataGridView1.AutoGenerateColumns = false;
            //清楚多余行
            this.dataGridView1.AllowUserToAddRows = false;

            /*
             * 套餐下拉框初始化
             * */
            HealthCheckSet set0 = new HealthCheckSet("请选择");
            HealthCheckSet set1 = new HealthCheckSet("入学体检");
            set.Add(set0.Name, set0);
            set.Add(set1.Name, set1);
            AddExamCbo();
        }

        //刷新项目下拉框
        public void AddExamCbo()
        {
            BindingSource source = new BindingSource();
            source.DataSource = set.Keys;
            this.cboExams.DataSource = source;
        }
        //套餐集合
        Dictionary<string, HealthCheckSet> set = new Dictionary<string, HealthCheckSet>();
        //初始化项目集合
        Dictionary<string, HealthCheckItem> allItems = new Dictionary<string, HealthCheckItem>();
        public void AddPhyCbo()
        {
            /*
             * 初始化(刷新)项目下拉框
             * */
            allItems.Clear();
            HealthCheckItem item1 = new HealthCheckItem("用于检查身高。", "身高", 5);
            HealthCheckItem item2 = new HealthCheckItem("用于检查体重。", "体重", 5);
            HealthCheckItem item3 = new HealthCheckItem("用于检查肝功能。", "肝功能", 50);
            HealthCheckItem item4 = new HealthCheckItem("用于检查视力。", "视力", 5);
            HealthCheckItem item5 = new HealthCheckItem("用于检查听力。", "听力", 5);
            HealthCheckItem item6 = new HealthCheckItem("用于检查B超。", "B超", 80);
            HealthCheckItem item7 = new HealthCheckItem("用于检查心电图。", "心电图", 100);
            allItems.Add(item1.Name, item1);
            allItems.Add(item2.Name, item2);
            allItems.Add(item3.Name, item3);
            allItems.Add(item4.Name, item4);
            allItems.Add(item5.Name, item5);
            allItems.Add(item6.Name, item6);
            allItems.Add(item7.Name, item7);
            this.cboPhy.DisplayMember = "name";
            BindingSource source = new BindingSource();
            source.DataSource = allItems.Keys;
            this.cboPhy.DataSource = source;
        }

        private void cboExams_SelectedIndexChanged(object sender, EventArgs e)
        {
            /*
             * 改变下拉框下标,判断下标。改变状态
             * */
            this.lblNames.Text = this.cboExams.Text;
            RenovateDgv();
            Btn();
            if (this.cboExams.SelectedIndex > 0)
            {
                this.btnAdd.Enabled = true;
                AddPhyCbo();
            }
            else
            {
                this.btnAdd.Enabled = false;
                this.cboPhy.DataSource = null;
            }
        }

        private void btnNew_Click(object sender, EventArgs e)
        {
            //非空验证
            if (txtNewName.Text == "" || txtNewName.Text == null)
            {
                MessageBox.Show("请输入套餐名称!");
                return;
            }
            /*
             * 集合添加套餐名
             * 并刷新下拉框
             * */
            HealthCheckSet set3 = new HealthCheckSet(this.txtNewName.Text);
            set.Add(set3.Name, set3);
            AddExamCbo();
            this.cboExams.Text = set3.Name;
            MessageBox.Show("添加成功!");
        }

        public void AddDgv()
        {
            //ToList()将双列集合转为单列集合
            //Contains()在单列集合中寻找是否已存在该项
            if (set[cboExams.Text].Items.Keys.ToList().Contains(this.cboPhy.Text))
            {
                MessageBox.Show("您已添加过此项!");
                return;
            }
            /*
             * 向套餐内添加项目
             * */
            set[cboExams.Text].Items.Add(cboPhy.Text, allItems[cboPhy.Text]);
            Btn();
            MessageBox.Show("添加成功!");

        }
        public void RenovateDgv()
        {
            /*
             * 刷新datagridview
             * */
            BindingSource source = new BindingSource();
            source.DataSource = set[cboExams.Text].Items.Values;
            dataGridView1.DataSource = source;
        }
        private void btnAdd_Click(object sender, EventArgs e)
        {
            /*
             * 添加套餐项目
             * */
            AddDgv();
            RenovateDgv();
        }

        public void Btn()
        {
            /*
             * 由集合内是否有元素,来改变删除按钮的状态
             * */
            if (set[cboExams.Text].Items.Count > 0)
            {
                this.btnDel.Enabled = true;
            }
            else
            {
                this.btnDel.Enabled = false;
            }

            /*
             * 计算套餐总金额
             * 并刷新控件
             * */
            set[cboExams.Text].Price = 0;
            foreach (KeyValuePair<string, HealthCheckItem> it in set[cboExams.Text].Items)
            {
                set[cboExams.Text].Price += it.Value.Price;
            }
            this.lblPrices.Text = set[cboExams.Text].Price.ToString();
        }

        private void btnDel_Click(object sender, EventArgs e)
        {
            /*
             * 由键来移除指定的集合元素
             * 并刷新控件显示的值与状态
             * */
            set[cboExams.Text].Items.Remove(this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString().Trim());
            RenovateDgv();
            Btn();
            MessageBox.Show("删除成功!");
        }
    }

 

网站地图xml地图