WPF XAML(二)

news2024/11/16 5:53:18

一、前言

本文是 WPF XAML(一)的续文,链接我就放下面了。

WPF XAML(一)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/135537094?spm=1001.2014.3001.5501

二、XAML 中空白与特殊字符

        在XAML中我们在设计程序的时候可能需要对文本进行一些空格或换行或者是输入 < >这样的特殊符号。但我们受到XML规则限制,都无法直接设置等操作。

举个例子:

  <TextBlock
      HorizontalAlignment="Center"
      VerticalAlignment="Center"
      FontSize="25">
      文      本
  </TextBlock>
  <TextBlock
      HorizontalAlignment="Center"
      VerticalAlignment="Center"
      FontSize="25" >
      文
          本
  </TextBlock>

示例解释:

        我们如果想显示多个空格显示效果为:文      本 但实际显示效果则是:文 本 。原因就在我们XAML中如果我们设置多个空格或者插入TAB 换行等都视为一个空格。在文本前后添加的所有空格也将忽略

效果:

解决当前问题 为元素使用  xml:space="preserve" 特性

举个例子:

<TextBlock
    HorizontalAlignment="Center"
    VerticalAlignment="Center" xml:space="preserve"
    FontSize="25" >
    文
        本
</TextBlock>

 示例解释:当前将会保留所有空格和文本的前后空格以及换行效果。

补充:如果是直接设置显示的文本的属性或者后台代码设置内容都将保留所有的空格。 


使用特殊符号举个例子我们想显示 <文本>的内容

举个例子:

  <!--<TextBlock
      HorizontalAlignment="Center"
      VerticalAlignment="Center"
      FontSize="25">
      <文本>
  </TextBlock>-->
  <TextBlock
      HorizontalAlignment="Center"
      VerticalAlignment="Center"
      FontSize="25">
      &lt;文本 &gt;
  </TextBlock>
  <TextBlock
      HorizontalAlignment="Center"
      VerticalAlignment="Center"
      FontSize="25">
      小于号 &lt; 大于号 &gt; 符号 &amp; 引号 &quot;
  </TextBlock>

 示例解释:

        在第一个TextBlock元素他将无法通过编译,因为<文本>编译器会以为你是想创建文本这个元素,或者是说”创建文本对象“。

        第二个采用特殊符号就可以显示上述文本:”<文本>“ 

        第三个是我给出的几种特殊符号的写法。

效果:

三、使用其他名称空间的内容

问:为什么要使用其他名称空间的内容?

答:1有时我们想将其他类型对象提取信息绑定到我门的控件属性上  2是使用其他类型为WPF 对象设置属性。

举个例子(使用自定义类型填充WPF 对象属性):

  public class Person
  {
      public string Age { get; set; }
  }
<Window
    x:Class="WpfApp5.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:local="clr-namespace:WpfApp5"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <ListBox DisplayMemberPath="Age">
        <local:Person Age="15" />
    </ListBox>
</Window>

示例解释:

         我们定义了一个自定义的类Person我们可以用它作为我们的wpf对象的属性进行填充,比如我们将当前这个类作为ListBox的填充内容。其中我们给当前对象设置了相应的属性并设置了list books当中的项如何显示内容,显示内容为Age。

        如果试图创建简单的基本类型(如字符串、日期或数字类型),可提供数据的字符串表示形式作为标签中的内容。XAML 解析器按着将使用类型转换器将符串转换为合适的对象。

举个例子:

<Window
    x:Class="WpfApp5.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:local="clr-namespace:WpfApp5"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <ListBox>
        <sys:DateTime>2003/11/01 12:10 AM</sys:DateTime>
    </ListBox>
</Window>

示例解释:

        sys 是希望在XAML标记中用于指示名称空间的XML前缀。例如,XAML语言使用x前缀。clr-namespace:System;是完全限定的NET名称空间的名称,assembly是声明类型的程序集,没有dll 扩展名。这个程序集必须在项目中用。如果希望使用项目程序集,可忽略这一部分。如Datetime是在mscorlib程序集中所有需要指定当前程序集。


提问:

问:怎么知道数据的程序集

答:可以反编译查看到。


         

效果预览: 

四、加载和编译XAML 

       完全可以创建不使用XAML的WPF 应用程序可使用三种不同的编码方式来创建WPF应用程序:

         只使用代码。这是在 Visual Studio 中为 Windows 窗体应用程序使用的传统方法。它通过代码语句生成用户界面。
        使用代码和未经编译的标记(XAML)。这种具体方式对于某些特殊情况是很有意义的例如创建高度动态化的用户界面。这种方式在运行时使用 System.Windows.Markup 名称空间中的XamIReader类,从XAML文件中加载部分用户界面。
        使用代码和编译过的标记(BAML)对于 WPF 而言这是一种更好的方式,也是 VisualStudio支持的一种方式。这种方式为每个窗口创建一个XAML模板,这个XAML 模板被编译为 BAML,并嵌入到最终的程序集中。编译过的 BAML 在运行时被提取出来用于重新生成用户界面。

一、举个例子(只使用代码):

1新建一个WPF程序 删除MainWindow.xaml  App.xaml 如下图

2 添加一个启动类 StartApp:

 [STAThread]
 static void Main()
 {
     new MyWindow().ShowDialog();
 }

3 添加窗体类,窗体类中的代码如下

 public class MyWindow : Window
 {
     public MyWindow()
     {
         InitializeComponent();
     }
     private Button button;
     private void InitializeComponent()
     {
         //设置窗体属性
         this.Title = "代码创建";

         //设置元素内容
         button = new Button();
         button.Content = "Click";
         button.Click += Button_Click;
         StackPanel stackPanel = new StackPanel();
         stackPanel.Children.Add(button);
         IAddChild addChild = stackPanel;

         this.Content = addChild;

     }

     private void Button_Click(object sender, RoutedEventArgs e)
     {
         MessageBox.Show("Hello");
     }
 }

示例解释: IAddChild 是一个 使得你能够动态地向 XAML 元素添加子元素,这是通过 AddChild 和 AddLogicalChild 方法实现的。

运行效果:

 二、使用代码和未经编译的标记(XAML)

举个例子:

1 先创建一个WIndow窗体文件,我们可以在XAML设计器中设计后复制到记事本在将记事本保存格式改为.XAML在添加到项目中。

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <ListBox Name="list">
        <ListBoxItem>
            <sys:DateTime>2003/11/01 12:10 AM</sys:DateTime>
        </ListBoxItem>
        <ListBoxItem>
            <sys:DateTime>2003/11/01 12:10 AM</sys:DateTime>
        </ListBoxItem>
        <ListBoxItem>
            <sys:DateTime>2003/11/01 12:10 AM</sys:DateTime>
        </ListBoxItem>
    </ListBox>
</Grid>

如上代码我们复制到记事本,在将记事本保存格式改为.XAML在添加到项目中。 

如图所示:

然后修改XAML文件的属性

2 我们继续使用我们前面使用到的MyWindow类,做一点修改。

    private void InitializeComponent()
    {
        //设置窗体属性
        this.Title = "代码创建";

        DependencyObject dependencyObject;
        //获取元素
        using (FileStream fileStream = new FileStream("MainWindow.Xaml", FileMode.Open))
        {
            dependencyObject = (DependencyObject)XamlReader.Load(fileStream);
        }
        //以下是两种方法
        //1--
        //查找具有适当名称的控件。.
        listBox = (ListBox)LogicalTreeHelper.FindLogicalNode(dependencyObject, "list");//返回类型 DependencyObject
        listBox.SelectionChanged += ListBox_SelectionChanged;
        //2--
        //装换为FrameworkElement类型 调用自身的FindName方法
        //FrameworkElement frameworkElement = (FrameworkElement)rootElement;
        //button1 = (Button)frameworkElement.FindName("button1");
        //设置元素内容
        button = new Button();
        button.Content = "Click";
        button.Width = 100;
        button.Height = 100;
        button.Click += Button_Click;

        if (dependencyObject is Grid grid)
        {
            grid.Children.Add(button);
            this.Content = dependencyObject;
        }
        else
        {
            StackPanel stackPanel = new StackPanel();
            stackPanel.Children.Add(button);
            IAddChild addChild = stackPanel;
            this.Content = addChild;
        }

    }

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        MessageBox.Show((sender as ListBox).SelectedItem.ToString());
    }

示例解释:

        XamlReader就是读取当前用方法将这个文件中的内容转换成DcpendcncyObjcct 对象,DcpendencyObjcct 是所有 WPF 控件继承的基类DependencyObjcct对象可放在任意类型的容器中。 查找具有适当名称的控件。LogicalTreeHelper.FindLogicalNode 第一个是.DcpendcncyObjccte类型参数,第二个是当前要查找的控件元素名称。


        解释一下为什么这是使用代码和未经编译的标记(XAML)的示例。因为,我先将XAML 编译为BAML,再在运行时加载BAML, 我们这里是没有经过我们的编译器编译过的,所以这是一个使用代码和未编译的标记的示例。

这样会比动态加载XAML的效率高,当用户界面比较复杂时尤其如此。

运行效果:

三、使用代码和编译过的标记(BAML)

         这里我们在前面的示例如:使用其他名称空间的内容,就是一个典型的示例。其中我需要补充几点。

       1 在运行时读取 BAML 比读取 XAML的速度要快部署更简单。

        2 因为 BAML 作为一个或多个资源嵌入到程序集中,不会丢失。

        3可在其他程序中编辑 XAML 文件,例如设计工具。这为程序编程人员和设计人员之间更好地开展协作提供了可能(当使用未编译的XAML时,也能获得这个好处,如上一节所)。

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

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

相关文章

鸿蒙ArkTS的起源和简介

theme: lilsnake 1、引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力&#xff0c;到具备类型系统的高效工程开发能力&#xff0c;再到融合声明式UI、多维状态管理等丰富的应用开发能力&#xff0c;共同…

TA百人计划学习笔记 2.6伽马矫正

资料 源视频 【技术美术百人计划】图形 2.6 伽马校正_哔哩哔哩_bilibili PPT 2600_伽马矫正 参考笔记 2.6伽马&#xff08;Gamma&#xff09;校正 语雀 从0开始的技术美术之路&#xff08;十&#xff09;伽马校正_线性工作流 技术美术-CSDN博客为什么 韦伯定理 人眼对于暗部是…

《MyBatis》-- 流式查询内存性能优化-单条数据加工

阿丹-需求/场景&#xff1a; 在项目场景中涉及到数据二次加工。需要将单个对象数据转为按照规定的数据字典的转换。以及需要转换数据结构。从对象转换为按照规定的值和规则的数组。 因为要写入csv文件&#xff0c;涉及到文件的输出流。 之前讨论针对的解决方案&#xff1a; …

HCIP第一次练习 -- RIP复习实验

要求&#xff1a; 需求:R1-R2-R3-R4-R5运行RIPV2 R6-R7运行RIPV1 1.使用合理地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回172.16.1.1/24172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条自数量,增加路由传递安全性 5.R5创建一个环回模拟运营商,不…

FFmpeg之SwrRessample

文章目录 一、概述二、重采样流程三、重要结构体3.1、SwrContext3.2、ResamplerContext 四、重要函数4.1、swr_alloc4.2、swr_alloc_set_opts4.3、av_opt_set_*4.4、swr_init4.5、av_samples_alloc_array_and_samples4.6、av_samples_alloc4.7、swr_convert4.8、swr_get_delay4…

Apache Solr <= 8.8.1任意文件读取漏洞复现CVE-2019-17558

一、环境准备 搭建环境vulhub&#xff0c;需要提前安装docker环境 docker安装&#xff1a;docker--安装docker-ce-CSDN博客 vulhub地址&#xff1a;https://github.com/vulhub/vulhub #创建靶场环境 mkdir /opt/vulhub cd /opt/vulhub git https://github.com/vulhub/vulhu…

Python基础知识:整理15 列表的sort方法

1 sorted() 方法 之前我们学习过 sorted() 方法&#xff0c;可以对列表、元组、集合及字典进行排序 # 1.列表 ls [1, 10, 8, 4, 5] ls_new sorted(ls, reverseTrue) print(ls_new) …

【Vue】后端返回文件流,前端预览文件

let date;request({url: this.$route.query.url,method: get,responseType: blob,}).then(resp > {date respthis.path window.URL.createObjectURL(new Blob([resp], {type: "application/pdf"}))}).catch((e) > {//旧版本浏览器下的blob创建对象window.Blo…

2019年认证杯SPSSPRO杯数学建模C题(第二阶段)保险业的数字化变革全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于统计建模的车险业数字变革研究 C题 保险业的数字化变革 原题再现&#xff1a; 车险&#xff0c;即机动车辆保险。保险自身是一种分散风险、消化损失的经济补偿制度&#xff0c;车险即为分散机动车辆在行驶过程中可能发作的未知风险和损失…

基于无人机的消防灭火系统设计

摘要&#xff1a;人类社会的进步&#xff0c;使火灾变得更加频繁且越来越复杂&#xff0c;随着这些年无人机技术的发展&#xff0c;将无人机技术融入消防灭火逐渐变成必然。消防救援采用无人机主要有以下几点原因&#xff1a;一、对火场及火场周围环境信息十分匮乏&#xff0c;…

CUDA tips

命令行查看核函数消耗的寄存器和共享内存数量 nvcc --ptxas-options-v reduce_sum.cu nvprof 使用 由于 8.0 及以上计算能力的显卡用不了 nvprof&#xff0c;官方建议用 nsight system 和 ncu&#xff0c;但是如果只想命令行打印表格查看 kernel 概况感觉还是 nvprof 方便&am…

.Net Core 使用 AspNetCoreRateLimit 实现限流

上一篇文章介绍过ASP.NET Core 的 Web Api 实现限流 中间件-CSDN博客 使用.NET 7 自带的中间件 Microsoft.AspNetCore.RateLimiting 可以实现简单的Api限流&#xff0c;但是这个.NET 7以后才集成的中间件&#xff0c;如果你使用的是早期版本的.NET&#xff0c;可以使用第三方库…

「解析」Jetson配置 git服务

这两天感冒了在家休养&#xff0c;想着把之前买的 Jetson 开发板用起来&#xff0c;买Jetson的初衷就是用来学习Linux系统&#xff0c;顺道可以部署算法&#xff0c;以及一些其他需求&#xff0c;相比树莓派而言&#xff0c;Jetson开发相对更贵&#xff0c;但是其配备了英伟达的…

科研绘图(五)玫瑰图

柱状图的高级平替可视化 “玫瑰图”&#xff0c;通常也被称为“科克斯图”。它类似于饼图&#xff0c;但不同之处在于每个部分&#xff08;或“花瓣”&#xff09;的角度相同&#xff0c;半径根据它表示的值而变化。这种可视化工具对于周期性地显示信息非常有用&#xff0c;比…

log4j2漏洞综合利用_CVE-2021-44228_CNVD-2021-95919

1.漏洞利用 1.1.rmi 利用 1、在检测到目标存在 log4j2 漏洞后&#xff0c;确定漏洞参数&#xff0c;尝试接受目标 rmi 请求。 成功接收到请求。 出现 JRMIK 字样即代表可接受 RMI 请求。 2、漏洞利用。 使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar执行命令&#xff0…

SAP 销售订单审批状态(查询/修改)

销售订单审批状态启用后&#xff0c;前端显示界面如下图 销售订单审批状态读取&#xff1a;STATUS_READ 销售订单审批状态修改&#xff1a;I_CHANGE_STATUS 销售订单审批状态读取 代码样例如下&#xff1a; DATA: lv_objnr TYPE vbak-objnr,lv_objnr_t TYPE jsto-objnr,l…

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 …

soso移动营业大厅(纯后端+MySQL数据库+JDBC)

一、项目需求 中国移动,中国联通,中国电信是国内3大通信运营商,每个运营商都提供了不同的品牌套餐来应对不同的用户群,比如北京移动主要有全球通,神州行,动感地带等3大品牌套餐,每种套餐的内容和费用不同,嗖嗖移动是一个假定的通信运营商,提供了话痨套餐,网虫套餐,超人套餐,各…

ElasticSearch入门篇

目录 一、 ElasticSearch的定位 二、 什么是倒排索引 三、 什么是全文检索 四、 ElasticSearch的数据存储原理 4.1 ElasticSearch与关系型数据库的数据结构对比 4.2 ElasticSearch的倒排索引原理 一、 ElasticSearch的定位 ElasticSearch是一款开源的分布式 搜索和…

【Linux终端工具】Tmux的使用教程,如何正确使用Tmux

文章目录 入门tmux什么是tmux&#xff1f;安装tmux快速启动tmux基本操作入门1. 分离与退出2. 帮助信息3. 新建会话4. 重新接入会话5. 窗格操作 进阶操作1. 会话管理2. 切换窗口3. 窗格间切换 总结 入门tmux 什么是tmux&#xff1f; tmux是一款终端复用器&#xff0c;它允许你…