C# 基本桌面编程(二)

一、前言

本章为C# 基本桌面编程技术的第二节也是最后一节。前一节在下面这个链接

C# 基本桌面编程(一)icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/135024535?spm=1001.2014.3001.5502

二、控件布局

1 叠放顺序

        在WPF当中布局,通常如果在同一个位置叠放了多个控件,那么控件则会被我们上一层的空间所覆盖。这个叠放就相当于我们的一个盒子我们盒子一层一层的叠放。我们从上往下看,只能看到最上一层。我们在控件布局当中也一样。当我们在同一个位置叠放多个相同或者是不同大小的控件则会造成我们只能看到最上一层的控件而底下被叠放住的控件可能无法看见或者是只能看见部分,在这种情况下,如果是在不能避免的情况下,我们通常可以使用属性来解决 。

属性:Panel.ZIndex  来解决。

举个例子:

 <Grid Name="grid"><ButtonHorizontalAlignment="Center"VerticalAlignment="Center"Panel.ZIndex="1"Content="按钮1" /><ButtonHorizontalAlignment="Center"VerticalAlignment="Center"Content="按钮2" /></Grid>

注意:我们在XAML中越后面写的控件,越显示在上方。  

2 对齐边距填充和尺寸

效果属性
尺寸宽度和高度Width和Height
控件水平位置HorizontalAlignment
控件垂直位置VerticalAlignment   
控件水平内容位置HorizontalContentAlignment
控件垂直内容位置VerticalContentAlignment
边距设置Margin 和Padding(左上右下,Thickness值)
填充如:HorizontalAlignment 设置为Stretch 控件的宽度就会随着容器的宽度所改变而改变 

3 面板控件

Canvas: Canvas.Left="" Canvas.Top=" " Canvas.Bottom=""  Canvas.Right=""  四个属性分别设置Canvas 控件子元素的位置。需要注意的是top和left属性的优先级高于Bottom和right

DockPanel:  DockPanel.Dock 可以指定停靠边缘的位置。作为附加属性可以给任何被DockPanel控件容纳的子属性。

提示:如果指定停靠某个位置务必要确定停靠的位置能容下当前需要停靠的控件 

Grid: Grid它可以将控件分为多行或者是多列,指定将子控件放在某一行或者某一列。

举个例子:

<Grid ShowGridLines="True"><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Button /><GridSplitterGrid.RowSpan="2"Grid.Column="0"BorderBrush="Black"BorderThickness="1" />
</Grid>

示例解释:

        ShowGridLines 是否显示分割线   <Grid.ColumnDefinitions> 创建了一个列集合,指定有多少列。当前是指定有两列。GridSplitter 控件能拖动,动态的改变分割的列大小。

Grid.Column是指定在地几行,也是一个附加属性。

StackPanel:Orientation属性可以设置当前控件的排放方式。控件效果:将包含的控件按照横向或者是纵向排布。

WrapPanel:和StackPanel效果一致。只不过它有一个特征:当前容器的宽度如果摆不下它会自动换行。

三、常用控件介绍

Lable、TextBlock、Button、Textbook、CheckBox、RadioButton、ComboBox、TabControl、image。

1 Lable

        显示文本。 Content 属性设置显示内容。在_+字母可以实现按住ALT的时候首字母下面会显示一个下划线。

举个例子:

  <Label Content="_Name" FontSize="50" />

运行效果:

2 TextBlock

        显示文本但是他的执行效率会比Lable高。如果显示文本过长无法显示可以放在 ScrollViewer 容器中。

举个例子:

 <ScrollViewer Height="150" VerticalScrollBarVisibility="Visible"><TextBlockFontSize="50"Text="_Na_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Name_Nameme"TextWrapping="Wrap" /></ScrollViewer>

示例解释:

        FontSize 设置字体大小。Text 设置内容信息  TextWrapping 设置换行方式。Wrap 为换行 ,NoWrap 不换行 ,WrapWithOverflow 当前放不下内容时,允许非常长的单个单词超出文本框的边缘  。

运行效果: 

 3 Button

        按钮处理用户点击。可以指定它的Content 来容量任何控件。

4 Textbook

        输入文本框。可以设置IsReadOnly 为 true 则控件不可输入。为只读。

举个例子:

  <TextBoxAcceptsReturn="False"IsEnabled="True"Text="输入"TextWrapping="Wrap"VerticalScrollBarVisibility="Visible" />

 示例解释:

        AcceptsReturn 设置在文本当中输入是否可以通过回车键换行。IsEnabled控件是否可用。Text 用户输入的内容 TextWrapping 换行的方式 VerticalScrollBarVisibility 设置当前控件中的垂直滚动条是否可见 

5 CheckBox

用来显示用户的选择。

举个例子:

 <CheckBoxContent="男"IsChecked="False"IsThreeState="True" />

示例解释: 

           Content 控件显示内容  IsChecked 控件是否被选中  IsThreeState控件是否有三种选择形态。(如何三种可选择形态是代表:确定、不确定、以及无法选择不清楚的含义 )  

6 RadioButton

        用来显示用户选择但是可以在多个选项当中筛选出只能选择一个选项例如给多个选项进行一个选项分组。

举个例子:

 <StackPanel><RadioButtonContent="显示内容1"GroupName="1"IsChecked="False" /><RadioButtonContent="显示内容2"GroupName="1"IsChecked="False" /><RadioButtonContent="显示内容3"GroupName="1"IsChecked="False" /></StackPanel>

示例解释:GroupName 设置分组名字。他是一个string类型。效果就是当多个RadioButton控件的GroupName 属性为同一个值,意思就是将他们分到了同一个组。那么同一个组将只能有一个选项被选择。通常这个控件可以用来做用户调研表格    

7 ComboBox

也是显示用户选择但是它比较节省空间。

举个例子:

 <Window.Resources><x:Array x:Key="MyitemSource" Type="s:String"><s:String>S1</s:String><s:String>S3</s:String><s:String>S3</s:String></x:Array></Window.Resources><Grid ShowGridLines="True"><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><ComboBox VerticalAlignment="Center" ItemsSource="{StaticResource MyitemSource}" /></Grid>

运行效果:

8 TabControl

将一个页面分割成多个页面

举个例子:

 <Window.Resources><x:Array x:Key="MyitemSource" Type="s:String"><s:String>S1</s:String><s:String>S3</s:String><s:String>S3</s:String></x:Array></Window.Resources><Grid ShowGridLines="True"><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><TabControl ItemsSource="{StaticResource MyitemSource}" /></Grid>

运行效果:

9 Image

图像控件用来放置图片。

举个例子:

<Grid ShowGridLines="True"><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Image Source="C:\Users\Administrator\Desktop\image2\1.jpg" />
</Grid>

 运行效果:

四、绑定

解释四种绑定方式 DataContext、绑定到本地对象、静态绑定到外部对象 、动态绑定到外部对象。

1 DataContext:

        将窗口的DataContext设置为该对象实例,则就是把当前窗口的绑定上下文指定到了该对象。

2 绑定到本地对象:

举个例子:

 <StackPanel VerticalAlignment="Center"><SliderName="Sl"VerticalAlignment="Center"Maximum="100" /><ProgressBarMinHeight="20"Maximum="100"Value="{Binding ElementName=Sl, Path=Value, Mode=TwoWay}" /></StackPanel>

示例解释:

        通过ElementName来指定绑定源。绑定一般由四个组件构成,绑定目标,目标属性,绑定源,属性源  。注意:不是每一次都要明确指出这四个部分,因为有些绑定目标已经被隐式指定了,在这里我们需要提供绑定源以及源属性就可以了 。

3 静态绑定到外部对象:

举个例子:

<Windowx:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:Lo="clr-namespace:WpfApp1"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow"d:DesignHeight="134.4"d:DesignWidth="253.12"BorderThickness="0"mc:Ignorable="d"><Window.Resources><Lo:Mylist x:Key="Mylist" /></Window.Resources><Grid ShowGridLines="True"><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><StackPanel VerticalAlignment="Center"><ComboBox ItemsSource="{StaticResource Mylist}" /></StackPanel></Grid></Window>
  public class Mylist : ObservableCollection<int>{public Mylist(){Add(1);Add(12);Add(13);}}

示例解释:

        当前我们在Windows的资源字典当中声明了一个名称空间,当前的名称空间就这个类所在的名称空间。所以我们可以通过当前的名称空间拿到我们创建的这个类,在资源字典当中声明之后并给它取一个键的名称。然后再我们控件当中的Itemsource再去绑定它  注意这里能绑定的原因是因为我当前这个类也是一个集合类Itemsource是一个IEnumerable 接口类型。这里能绑定是因为我的类实现了当前这个接口。

4 动态绑定到外部对象:

动态创建的对象意思就是我们绑定的数据可以实时的加载变更。

举个例子:

using System;
using System.ComponentModel;
using System.IO;
using System.Windows;
using System.Xml.Serialization;namespace WpfApp1
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{My Mys=new My ();public MainWindow(){DataContext = Mys;InitializeComponent();if (File.Exists("My.xml")){var serializer = new XmlSerializer(typeof(My));using (var stream = File.OpenRead("My.xml")){var deserializedMy = serializer.Deserialize(stream) as My;if (deserializedMy != null){Mys.Age = deserializedMy.Age;Mys.Name = deserializedMy.Name;}}}}private void Button_Click(object sender, RoutedEventArgs e){if (!string.IsNullOrWhiteSpace(Mys.Name) && Mys.Age != default){var serializer = new XmlSerializer(typeof(My));using (var stream = File.Open("My.xml",FileMode.Create)){serializer.Serialize(stream, Mys);}}}}[Serializable]public class My:INotifyPropertyChanged{public My(){}private int age;public int Age{get { return age; }set { age = value; Update_Data(nameof(Age)); }}private string name;public event PropertyChangedEventHandler PropertyChanged;public void Update_Data(string p){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(p));}public string Name{get { return name; }set { name = value; Update_Data(nameof(Name)); }}}
}
<Windowx:Class="WpfApp1.MainWindow"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"Title="MainWindow"Width="643"Height="384"BorderThickness="0"mc:Ignorable="d"><Canvas><LabelCanvas.Left="82"Canvas.Top="50"Content="姓名" /><TextBoxCanvas.Left="131"Canvas.Top="55"Width="79"Height="15"HorizontalAlignment="Left"VerticalAlignment="Top"Text="{Binding Name}" /><LabelCanvas.Left="80"Canvas.Top="88"HorizontalAlignment="Left"VerticalAlignment="Top"Content="年龄" /><TextBoxCanvas.Left="132"Canvas.Top="93"Width="83"Height="14"HorizontalAlignment="Left"VerticalAlignment="Center"Text="{Binding Age}" /><ButtonCanvas.Left="248"Canvas.Top="91"Width="72"Height="17"HorizontalAlignment="Left"VerticalAlignment="Center"Click="Button_Click"Content="保存" /></Canvas></Window>

当前运行效果:当你按下保存按钮将把你的数据保存起来,在下次启动时自动加载 。

界面样貌:

         我只是粗略的介绍了当前章节内容,因为我实在是太熟悉本章节内容,所以做了很多筛检,详细文章推荐大家阅读书籍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

饥荒Mod 开发(十):制作一把AOE武器

饥荒Mod 开发(九)&#xff1a;物品栏排列 饥荒Mod 开发(十一)&#xff1a;修改物品堆叠 前面的文章介绍了很多基础知识以及如何制作一个物品&#xff0c;这次制作一把武器&#xff0c;装备之后可以用来攻击怪物。 制作武器贴图和动画 1.1 制作贴图。 先准备一张武器的贴图&a…

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’

解决&#xff1a;AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’ 文章目录 解决&#xff1a;AttributeError: module scipy.misc has no attribute imsave背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退&#xff08;不推荐&#…

鸿蒙4.0核心技术-WebGL开发

场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。 接口说明 表1 WebGL主要接口列表 接口名描述canvas.getContext获取canvas对象上下文。webgl.createBuffer(): WebGLBuffernullwebgl.bindBuffer(target: GLenum, buffer: …

饥荒Mod 开发(十三):木牌传送

饥荒Mod 开发(十二)&#xff1a;一键制作 饥荒Mod 开发(十四)&#xff1a;制作屏幕弹窗 一键传送源码 饥荒的地图很大&#xff0c;跑地图太耗费时间和饥饿值&#xff0c;如果大部分时间都在跑图真的是很无聊&#xff0c;所以需要有一个能够传送的功能&#xff0c;不仅可以快速…

Web前端-JavaScript(js表达式)

文章目录 JavaScript基础第01天1.编程语言概述1.1 编程1.2 计算机语言1.2.1 机器语言1.2.2 汇编语言1.2.3 高级语言 1.4 翻译器 2.计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 3.初始JavaScript3.1 JavaScript 是什么3.2 JavaScript的作用3.3 HTML/CSS/…

《点云处理》平面拟合

前言 在众多点云处理算法中&#xff0c;其中关于平面拟合的算法十分广泛。本篇内容主要是希望总结归纳各类点云平面拟合算法&#xff0c;并且将代码进行梳理保存。 环境&#xff1a; VS2019 PCL1.11.1 1.RANSAC 使用ransac对平面进行拟合是非常常见的用法&#xff0c;PCL…

医疗智能化革命:AI技术引领医疗领域的创新进程

一、“AI”医疗的崛起 随着人工智能&#xff08;AI&#xff09;技术的崛起&#xff0c;"AI"医疗正在以惊人的速度改变着医疗行业的面貌。AI作为一种强大的工具&#xff0c;正在为医疗领域带来前所未有的创新和突破。它不仅在医学影像诊断、病理学分析和基因组学研究等…

设计模式——状态模式

引言 状态模式是一种行为设计模式&#xff0c; 让你能在一个对象的内部状态变化时改变其行为&#xff0c; 使其看上去就像改变了自身所属的类一样。 问题 状态模式与有限状态机 的概念紧密相关。 其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中…

手拉手EasyExcel极简实现web上传下载(全栈)

环境介绍 技术栈 springbootmybatis-plusmysqleasyexcel 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性…

CentOS7安装教程

1.准备工作 安装虚拟机软件 VMware Workstation 17 Player下载CentOS7 镜像 2. 安装VMware Workstation 17 Player 官网 下载链接 下载好了安装包&#xff0c;双击安装包&#xff0c;傻瓜式安装一直下一步&#xff0c;安装即可。 3. 安装CentOS7 官网 推荐下载地址&…

Tekton 构建容器镜像

Tekton 构建容器镜像 介绍如何使用 Tektonhub 官方 kaniko task 构建docker镜像&#xff0c;并推送到远程dockerhub镜像仓库。 kaniko task yaml文件下载地址&#xff1a;https://hub.tekton.dev/tekton/task/kaniko 查看kaniko task yaml内容&#xff1a; 点击Install&…

RabbitMQ 消息持久化

默认情况下&#xff0c;exchange、queue、message 等数据都是存储在内存中的&#xff0c;这意味着如果 RabbitMQ 重启、关闭、宕机时所有的信息都将丢失。 RabbitMQ 提供了持久化来解决这个问题&#xff0c;持久化后&#xff0c;如果 RabbitMQ 发送 重启、关闭、宕机&#xff…

05 动态渲染数据

概述 实际上动态渲染数据&#xff0c;在《使用CDN开发Vue3项目》中就已经学习过了&#xff0c;核心代码如下&#xff1a; <div id"vue-app">{{text}}</div> <script src"https://cdn.staticfile.org/vue/3.0.5/vue.global.js"></sc…

【运维笔记】Hyperf正常情况下Xdebug报错死循环解决办法

问题描述 在使用hyperf进行数据库迁移时&#xff0c;迁移报错&#xff1a; 查看报错信息&#xff0c;错误描述是Xdebug检测到死循环&#xff0c;可是打印的堆栈确实正常堆栈&#xff0c;没看到死循环。 寻求解决 gpt 说的跟没说一样。。 google一下 直接把报错信息粘贴上去…

I.MX RT1170双核学习(3):多核管理之MCMGR源码分析详解

本文通过SDK中最简单的hello_world例程来说明一下双核程序如何运行。在CM7和CM4的工程中都有一个MCMGR(Multicore Manager)文件夹&#xff0c;它是用来管理多核之间的操作的&#xff0c;当然也包括我们前面提到的那些寄存器的设置。 文章目录 1 MCMGR_EarlyInit1.1 MCMGR_Trigg…

MFC 程序执行流程

目录 MFC 程序启动 MFC 入口函数 程序执行流程总结 在Win32课程中WinMain由程序员自己实现&#xff0c;那么流程是程序员安排&#xff0c;但到了MFC中&#xff0c;由于MFC库实现WinMain&#xff0c;也就意味着MFC负责安排程序的流程。 MFC 程序启动 程序的启动&#xff0c;…

PCB设计规则中的经验公式_笔记

PCB设计规则中的经验公式 规则1 - 临界长度规则2 - 信号带宽与上升时间规则3- 时钟信号带宽规则4-信号传输速度规则5- 集肤 (效应) 深度规则6 - 50Ω传输线电容规则7 - 50Ω传输线电感规则8 - 回流路径电感规则9 - 地弹噪声规则10- 串行传输比特率与信号带宽规则11- PCB走线直流…

HIVE窗口函数

什么是窗口函数 hive中开窗函数通过over关键字声明&#xff1b;窗口函数&#xff0c;准确地说&#xff0c;函数在窗口中的应用&#xff1b;比如sum函数不仅可在group by后聚合&#xff0c;在可在窗口中应用&#xff1b; hive中groupby算子和开窗over&#xff0c;shuffle的逻辑…

面试 Java 算法高频题五问五答第一期

面试 Java 算法高频题五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;括号生成: 数字 n 代表生成括号的对数&#xff0c;请你设计一个…

OpenSergo Dubbo 微服务治理最佳实践

*作者&#xff1a;何家欢&#xff0c;阿里云 MSE 研发工程师 Why 微服务治理&#xff1f; 现代的微服务架构里&#xff0c;我们通过将系统分解成一系列的服务并通过远程过程调用联接在一起&#xff0c;在带来一些优势的同时也为我们带来了一些挑战。 如上图所示&#xff0c;可…