精华内容
下载资源
问答
  • XAML窗口变化

    2019-06-17 19:38:00
    今天要讲的是XAML窗口变化,什么是窗口变化?就是运行的时候,把窗口的大小和位置都调整一遍,在一次运行的时候,窗口的位置是根据上一次的调整而出现,至于它是着么出现的,我们来看一下。 首先:创建一个窗口...

    今天要讲的是XAML的窗口变化,什么是窗口变化?就是运行的时候,把窗口的大小和位置都调整一遍,在一次运行的时候,窗口的位置是根据上一次的调整而出现,至于它是着么出现的,我们来看一下。
    首先:创建一个窗口页面,名字随便命名,然后在宽度和高度的后面写上一个事件代码Closing。
    代码如下:

     <Window x:Class="WPF_dome.窗口变化大小"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="窗口变化大小" Height="300" Width="300" Closing="Window_Closing">
       <Grid>
        
     </Grid>
    

    第二步:写好事件后跳转到后台,编写后台代码,先读取配置文件,然后在设置位置和大小,在设置窗口状态,然后在跳转的事件名称里写上保存当前位置、大小和状态,到配置文件的代码。
    代码如下:

     Public 窗口变化大小()
     {
          InitializeComponent();
          //读取配置文件
          try{
            //设置位置、大小
            Rect restoreBounds =
            Properties.Settings.Default.MainRestoreBounds;
            this.WindowState = WindowState.Normal;
            this.Left = restoreBounds.Left;
            this.Top = restoreBounds.Top;
            this.Width = restoreBounds.Width;
             this.Height = restoreBounds.Height;
             //设置窗口状态
             this.WindowState =
             Properties.Settings.Default.MainWindowState;
    }
    Catch{ }
    }
    
    Private void Window_Closing(object sender, System.ComponentModel.
    CancelEventArgs e)
    {
         //保存当前位置、大小和状态,到配置文件
         Properties.Settings.Default.MainRestoreBounds =
         this.RestoreBounds;
         Properties.Settings.Default.MainWindowState =
         this.WindowState;
         Properties.Settings.Default.Save();
    }
    

    第三步:当你启动的时候,去调固定大小是不行的,是保存不了你固定的大小和位置的,为什么会保存不了呢?是应为我们VS里少了一种配置,所以我们保存不了,这时我们就要去弄一些配置程序。
    首先找到Properties下面的Settings.settings 文件(图1),把里面的原属性删掉,在里面添加两个属性,分别是MainRestoreBounds和MainWindowState它们的类型是属于Systrm.Windows.Rect和System.Windows.WindowState,范围都是用户,值是0,0,0,0和Normal,弄好之后就可以了。

    图1:
    在这里插入图片描述

    展开全文
  • WPF使用XAML来搭建一个登录窗口 在Wpf项目中的学习中,在WPF中,我了解到常用的窗口页面布局元素有五个,分别为Grid网格,DockPanel泊靠式面板,StackPanel栈式面板,WrapPanel自动折行面板,Canvas画布。 使用...

    WPF使用XAML来搭建一个登录窗口

    在Wpf项目中的学习中,在WPF中,我了解到常用的窗口页面布局元素有五个,分别为Grid网格,DockPanel泊靠式面板,StackPanel栈式面板,WrapPanel自动折行面板,Canvas画布。

    使用grid网格布局,通常采用grid网格面板来进行布局,grid网格面板,就好比如一张格子网,将一个页面分隔成我们想要的行列,在其中放入具体的内容,控件,或其他布局元素进行组合呈现预想中的样子。

    泊靠式面板:内部元素可以选择泊靠的方向(上下左右)。

    栈式面板:可将包含的元素在水平或垂直方向排成一条线,后面的元素会自动向前填充空缺。常用用于制作菜单栏。

    WrapPanel:自动折行面板,内部元素在排满一行后能自动折行,类html中流式布局

    Canvas:画布,内布元素可以使用像素为单位的绝对坐标进行定位。常用于制做动画。

     

    那么我们将使用xaml来搭建一个登录窗口,打开vs2015后,创建一个wpf项目,在项目中新建wpf窗口项,因此得到一个窗口设计页面,在vs设计器中,充分体现所见即所得的思想,在设计器中的设计成如何运行后就是如何。搭建一个登录窗口,设计窗口所在位置,大小,标题及启动图标样式。这样就能得到一个空白的特定大小的窗口

    设计一个登录窗,使用网格布局,按照设想中的比例,将页面进行划分切割,比如说,将页面切割成三行三列,九宫格的样子。默认下为等比例切割,但可以设定为特定的比例。在指定放一个border,这个网格里用来设定用户账号,密码等用户输入内容的文本,因而设定其背景色彩,背景色彩的设置与其他背景色形成对比,吸引用户注意力。

    如下源码,

    在完成设置后,需要往里面填加具体的设置,如何将内容放入呢?需要使用附加属性语法定义放置所在的行和列。登录页,具体为什么登录,所以这里需要一个标题,明确提示,登录的系统是什么系统,这里使用自动折行面板,将自动折行面板放置在第0行,第0列中,因所展示的内容较长,跨两列,方向水平,得到一个横向的条幅。将用户登录时的图平放置在第一行中。

    在内容区里放置用户登录时需要的输入的账号及密码的文本框,登录按钮等,由于放置的内容较多,需要将单个网格进行再划分为若干网格,为了让用户账号及密码输入框看起开和谐美观,将部分空间划分用于分隔。使用textblock控件放置文本,使用textbox放置用户输入框。

    使用button按钮设置登录按钮及取消登录按钮,由于默认下的按钮样式,过于单调,所以重新设置了按钮的样式,更改其默认下的边框画刷,背景色,重设其内容文本的字体的样式,大小。

    页面窗口效果如下图:

    展开全文
  • XAML

    千次阅读 2018-10-30 21:30:49
    什么是XAML命名空间? XAML命名空间实际上是XML命名空间概念的扩展。指定XAML命名空间的技术依赖于XML命名空间语法,使用URI作为命名空间标识符的约定,使用前缀提供从同一标记源引用多个命名空间的方法,等等.XML...

    什么是XAML命名空间?

    XAML命名空间实际上是XML命名空间概念的扩展。指定XAML命名空间的技术依赖于XML命名空间语法,使用URI作为命名空间标识符的约定,使用前缀提供从同一标记源引用多个命名空间的方法,等等.XML命名空间被添加到XAML定义主要概念是,XAML命名空间游戏所有既。标记用法英语谚语英语谚语的唯一性范围,影响也。标记实体可能由特定CLR空间命名引用状语从句:程序的集请立即获取的iTunes的方式。后一种考虑也受到XAML模式上下文概念的影响。但是出于WPF如何使用XAML命名空间的目的,您通常可以根据默认的XAML命名空间(XAML语言命名空间)来考虑XAML命名空间,

    WPF XAML和命名空间声明

    在许多XAML文件的根标记中的名称空间声明中,您将看到通常有两个XML名称空间声明。第一个声明将整个WPF客户端/框架XAML命名空间映射为默认名称:

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    第二个声明映射一个单独的XAML命名空间,将其(通常)到映射  x:前缀。

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    声明这些的之间关系的英文   前缀映射请| |立即iTunes中的电子杂志XAML作为语言定义一部分的内在函数,而WPF是一种使用XAML作为语言并为XAML定义其对象的词汇表的实现因为WPF词汇表的用法比XAML内在函数用法更常见,所以WPF词汇表被映射为默认词汇表。 x:

    x: 映射XAML语言内在函数支持的前缀约定后面是项目模板,示例代码以及此SDK中语言功能的文档.XAML命名空间定义了许多常用功能,即使对于基本WPF应用程序也是如此。例如,为了通过部分类将任何后台代码连接到XAML文件,将该必须类命名为  x:Class  相关XAML文件的根元素中的属性。或者,希望您作为键控资源访问的XAML页面中定义的任何元素都应该 

     

    映射到自定义类和程序集

    您可以使用xmlns 前缀声明中的一系列标记将XML名称空间映射到程序集,类似于标准WPF和XAML-intrinsics XAML名称空间映射到前缀的方式。一系列前缀声明标记将XML名称空间映射到程序集,类似于标准WPF和XAML的内在(XAML-内联函数)XAML名称空间映射到前缀的方式。

    语法采用以下可能的命名标记和以下值:

    clr-namespace: 在程序集中声明的CLR名称空间,其中包含要公开为元素的公共类型。

    assembly= 包含部分或全部引用的CLR命名空间的程序集。此值通常只是程序集的名称,而不是路径,并且不包括扩展名(例如的.dll文件或压缩的.exe)。必须在包含您要映射的XAML的项目文件中将该程序集的路径建立为项目引用。为了合并版本控制和强名称签名,该  assembly 值可以的英文的AssemblyName定义的字符串,而不是简单的字符串名称。

    请注意,将clr-namespace 标记与其值分隔的字符的英文冒号(:),而将assembly 标记与其值分隔的字符的英文等号(=)。这两个令牌之间使用的字符是分号。此外,请勿在声明中的任何位置包含任何空格。

    例子:后台代码如下

    namespace SDKSample {  
        public class ExampleClass : ContentControl {  
            public ExampleClass() {  
            ...  
            }  
        }  
    } 

    则在XAML文件中应该这么定义

    xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"

    映射到当前程序集

    assembly :如果clr-namespace 引用的英文在与引用自定义类的应用程序代码相同的程序集中定义的,则可以省略   或者,此情况的等效语法是指定。  assembly=,在等号后面没有字符串标记。

    如果在同一程序集中定义,则自定义类不能用作页面的根元素部分类不需要映射。如果您打算将它们作为XAML中的元素引用,则只需要映射不是应用程序中页面的部分类的类。

    将CLR命名空间映射到程序集中的XML命名空间

    WPF定义了XAML处理器使用的CLR属性,以便将多个CLR命名空间映射到单个XAML命名空间。此属性XmlnsDefinitionAttribute被放置在生成程序集的源代码中的程序集级别WPF程序集源代码使用此属性将各种常见名称空间(如System.Windows程序状语从句:System.Windows.Controls)映射到http://schemas.microsoft.com/winfx/2006/xaml/presentation名称空间

    XmlnsDefinitionAttribute需要两个参数:XML / XAML命名空间名称和CLR命名空间的名称。不止一个XmlnsDefinitionAttribute可以存在多个CLR命名空间映射到相同的XML命名空间。一旦映射,如果需要,通过using在部分类代码隐藏页面中提供适当的语句,可以也。在没有完全限定的情况下引用这些命名空间的成员。有关更多详细信息,请参阅XmlnsDefinitionAttribute

    XAML模板的名称空间和其他前缀

    如果您正在使用WPF XAML的开发环境和/或设计工具,您可能会注意到XAML标记中还有其他已定义的XAML命名空间/前缀。

    Visual Studio的WPF Designer使用通常映射到前缀的设计器命名空间d: .WPF的最新项目模板可能预先映射此XAML命名空间,以支持在Visual Studio的WPF Designer和其他设计环境之间交换XAML。此设计XAML命名空间用于在设计器中往返基于XAML的UI时保持设计状态。它还用于诸如d:IsDataSource在设计器中启用运行时数据源的功能。

    您可能会看到映射的另一个前缀是mc:mc:用于标记兼容性,并且正在利用不一定特定于XAML的标记兼容性模式。在某种程度上,标记兼容性柯林斯功能用于在框架之间或跨支持实现的其他边界交换XAML,在XAML模式上下文之间工作,为设计器中的有限模式提供兼容性等。有关标记兼容性概念及其与WPF的关系的更多信息,请参阅  标记兼容性( mc :)语言功能

    WPF和装配加载

    WPF XAML的模式上下文与WPF应用程序模型集成,后者又使用CLR定义的AppDomain的概念。以下序列描述了XAML架构上下文如何根据WPF对AppDomain中的使用和其他因素来解释如何在运行时或设计时加载程序集或查找类型。

    1. 迭代AppDomain,从最近加载的程序集开始,查找已经加载的程序集,该程序集匹配名称的所有方面。

    2. 如果名称是限定的,则在限定名称上调用Assembly.Load(String)

    3. 如果限定名称的短名称+公钥标记与从中加载标记的程序集匹配,则返回该程序集。

    4. 使用短名称+公章标记来调用Assembly.Load(String)

    5. 如果名称不合格,请调用Assembly.LoadWithPartialName

    松散的XAML不使用第3步; 没有加载程序集。

    编译的WPF XAML(通过XamlBuildTask生成)不使用AppDomain中已加载的程序集(步骤1)。此外,名称永远不应该从XamlBuildTask输出中取消资格,因此步骤5不适用。

    编译的BAML(通过PresentationBuildTask生成)使用所有步骤,但BAML也不应包含不合格的程序集名称。

     

    加载的XAML应用程序中的名称范围

    在更广泛的编程或计算机科学上下文中,编程概念通常包括可用于访问对象的唯一标识符或名称的原理。对于使用标识符或名称的系统,名称范围定义了如果请求该名称的对象,或者强制执行标识名称唯一性的边界,进程或技术将在其中搜索的边界。这些一般原则适用于XAML名称范围。在WPF中,在加载页面时,在XAML页面的根元素上创建XAML名称范围。从页面根开始的XAML页面中指定的每个名称都将添加到相关的XAML名称范围。

    在WPF XAML中,作为公共根元素(例如窗口)的元素始终控制XAML名称范围。如果诸如FrameworkElement的FrameworkContentElement上之类的元素是标记中页面的根元素,则XAML处理器会隐式添加  根,以便页面可以提供有效的XAML名称范围。

     注意:

    即使没有在XAML中标记的任何元素上定义属性Namex:Name属性,WPF构建操作也会为XAML生成创建XAML名称范围。

    如果您尝试在任何XAML名称范围内使用相同的名称两次,则会引发异常。对于具有代码隐藏并且是已编译应用程序一部分的WPF XAML,在初始标记编译期间为页面创建生成的类时,WPF构建操作会在构建时引发异常。对于未通过任何构建操作进行标记编译的XAML,可能会在加载XAML时引发与XAML名称范围问题相关的异常.XAML设计人员也可能在设计时预见到XAML名称范围问题。

    将对象添加到运行时对象树

    WPAM XAML名称范围的时刻。如果在解析生成该树的XAML之后的某个时间点向对象树添加对象,则新对象上的值Namex:Name值不会自动更新XAML范围中的信息。要在加载XAML后将对象的名称添加到WPF XAML名称范围中,必须在定义XAML名称范围的对象上调用RegisterName的相应实现,该对象通常是XAML页根。如果未注册名称,则无法通过FindName等方法按名称引用添加的对象,并且不能将该名称用于动画定位。

    应用程序开发人员最常见的情况是,您将使用RegisterName将名称RegisterName到页面当前根目录的XAML名称范围中。RegisterName是针对动画对象的故事板的重要场景的一部分。有关更多信息,请参阅故事板- 观察

    如果在除定义XAML名称范围的对象之外的对象上调用RegisterName,则该名称仍会在XAML名称范围内注册,调用对象将保留在该名称范围内,就像您在XAML名称范围定义对象上调用了RegisterName一样。

    代码中的XAML Namescopes

    您可以在代码中创建并使用XAML名称范围。即使对于纯代码使用,XAML名称范围创建中涉及的API和概念也是相同的,因为WPF XAML的处理器在处理XAML本身时使用这些API和概念概念。和API的存在主要是为了能够在对象树中按名称查找对象,该对象树通常部分或完全在XAML中定义。

    对于以编程方式而非加载的XAML创建的应用程序,定义XAML名称范围的对象必须实现INameScope,或者是FrameworkElementFrameworkContentElement派生类,以支持在其实例上创建XAML名称范围。

    此外,对于未由XAML处理器加载和处理的任何元素,默认情况下不会创建或初始化对象的XAML名称范围。您必须为随后要将名称注册到的任何对象显式创建新的XAML名称范围。要创建XAML名称范围,请调用静态SetNameScope方法。将指定其作为dependencyObject参数拥有的对象,并将新的名称范围构造函数调用作为value参数。

    如果dependencyObjectSetNameScope提供的对象不是INameScope实现,FrameworkElementFrameworkContentElement在任何子元素上调用RegisterName都不起作用。如果您未能显式创建新的XAML名称范围,则对RegisterName的调用将引发异常。有关在代码中使用XAML namescope API的示例,请参见定义名称范围

    样式和模板中的XAML名称范围

    WPF中的样式和模板提供了以直接方式重用和重新应用内容的能力。但是,样式和模板也可能包含在模板级别定义的XAML名称的元素。可以在页面中多次使用相同的模板。因此,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关

    请考虑以下示例:

    <Page
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      >
      <Page.Resources>
        <ControlTemplate x:Key="MyButtonTemplate" TargetType="{x:Type Button}">
          <Border BorderBrush="Red" Name="TheBorder" BorderThickness="2">
            <ContentPresenter/>
          </Border>      
        </ControlTemplate>
      </Page.Resources>
      <StackPanel>
        <Button Template="{StaticResource MyButtonTemplate}">My first button</Button>
        <Button Template="{StaticResource MyButtonTemplate}">My second button</Button>
      </StackPanel>
    </Page>

    这里,相同的模板应用于两个不同的按钮。如果模板没有不同的XAML  TheBorder名称范围,则模板中使用的名称将导致XAML名称范围中的名称冲突。模板的每个实例都有自己的XAML名称范围,因此在本例中,每个实例化模板的XAML名称范围只包含一个名称。

    样式还定义了自己的XAML名称范围,主要是为了使故事板的某些部分可以分配特定的名称。这些名称启用控制特定行为,这些行为将定位该名称的元素,即使模板已重新定义为控件自定义的一部分。

    由于单独的XAML名称范围,在模板中查找命名元素比在页面中查找非模板化命名元素更具挑战性。首先需要通过获取应用模板的控件的模板属性值来确定应用的模板。然后,调用FindName的模板版本,将应用模板的控件作为第二个参数传递

    如果您是控件作者,并且您约定,通过控件本身定义,则可以使用控件实现代码中的GetTemplateChild方法。该GetTemplateChild方法是受保护的,因此只有控件作者才能访问它。

    如果您在模板中工作,并且需要访问应用模板的XAML名称范围,请获取TemplatedParent的值,然后在那里调用FindName。在模板中工作的一个示例是,如果您正在编写事件处理程序实现,其中将从应用模板中的元素引发事件。

    FrameworkElement具有FindNameRegisterNameUnregisterName方法。如果您调用这些方法的对象拥有XAML名称范围,则这些方法将调用相关XAML名称范围的方法。否则,检查父元素以查看它是否拥有XAML名称范围,并且此过程以递归方式继续,直到找到XAML名称范围(由于XAML处理器行为,保证在根处有XAML名称范围)FrameworkContentElement上具有类似的行为,但FrameworkContentElement上没有XAML名称范围。这些方法存在于FrameworkContentElement上上,因此最终可以将调用转发到FrameworkElement的父元素。

    SetNameScope用于将新的XAML名称范围映射到现有对象。您可以多次调用SetNameScope以重置或清除 XAML名称范围,但这不是常见用法。此外,GetNameScope通常不会从代码中使用。

    XAML Namescope实现

    以下类直接实现INameScope

    ResourceDictionary中不使用XAML名称或名称范围; 使用键代替,因为它是一个字典实现。ResourceDictionary中实现INameScope的唯一原因的英文它可以引发用户代码的异常,这有助于阐明真正的XAML名称范围与ResourceDictionary中如何处理密钥之间的区别,并确保XAML名称范围不会通过父元素应用于ResourceDictionary

    FrameworkTemplateStyle通过显式接口定义实现INameScope。显示实现允许这些XAML名称范围在通过INameScope接口访问时按常规行为,这是WPF内部进程传送XAML名称范围的方式。但是显式接口定义不是FrameworkTemplateStyle的传统API表面的一部分,因为您很少需要直接在FrameworkTemplateStyle上调用INameScope方法,而是使用其他API,例如GetTemplateChild

    以下类通过使用System.Windows.NameScope帮助程序类并通过NameScope.NameScope附加属性连接到其XAML名称范围实现来定义自己的XAML名称范围:

    内联样式和模板

    Windows Presentation Foundation(WPF)提供Style对象和模板对象(FrameworkTemplate子类),作为定义资源中元素的可视外观的方法,以便可以多次使用它们。因此,XAML中采用StyleFrameworkTemplate类型的属性几乎总是对现有样式和模板进行资源引用,而不是内联定义新内容。

    内联样式和模板的限制

    在可扩展应用程序标记语言(XAML)中,样式和模板属性在技术上可以通过两种方式之一进行设置。您可以使用属性语法来引用在资源中定义的样式,例如<按钮  Style="{StaticResource  myResourceKey}" .../>。或者您可以使用属性元素语法来定义内联样式,例如:

    <object>
       <object.Style>
          <Style .../>
        </object.Style>
    </object>

    属性用法更常见。内联定义但未在资源中定义的样式必须仅限于包含元素,并且不能轻易地重复使用,因为它没有资源键。通常,资源定义的样式更通用且更有用,并且更符合一般的Windows Presentation Foundation(WPF)编程模型原则,即将代码中的程序逻辑与标记中的设计分离。通常没有理由设置内联样式或模板,即使您只打算在该位置使用该样式或模板。 。可以采用样式或模板的元素也支持内容属性和内容模型如果您只使用通过样式或模板创建的任何逻辑树,那么使用直接标记中的等效子元素填充该内容属性会更容易。这将完全绕过样式和模板机制。样式和模板也可以使用返回对象的标记扩展启用的其他语法。具有可能方案的两个这样的扩展包括TemplateBindingBinding

    类型转换器和XAML

    本主题介绍了从字符串转换类型作为常规XAML语言功能的目的。在.NET Framework中,TypeConverter 类用作特定用途,作为托管自定义类的实现的一部分,该托管自定义类可用作XAML属性。用法中的属性值如果编写自定义类,并且希望类的实例可用作XAML可设置属性值,则可能需要将TypeConverterAttribute 应用于类,编写自定义类型转换器类或两者。

    类型转换概念

    XAML和字符串值

    在XAML文件中设置属性值时,该值的初始类型是纯文本中的字符串。甚至像这样的其他原语最初也是XAML处理器的文本字符串.XAML处理器需要两条信息才能处理属性值。第一条信息是的属性的值类型允许被设置。定义的属性值在XAML中处理的任何字符串最终都可以转换或解析为该类型的值。如果值是XAML解析器理解的基元(例如数值),则尝试直接转换字符串。如果该值是枚举,则该字符串用于检查与该枚举中的命名常量的名称匹配如果该值既不是解析器理解的原语也不是枚举,则所讨论的类型必须能够基于转换的字符串提供类型的实例或值。这是通过指示类型转换器类来完成的

    在XAML中使用现有类型转换行为

    根据您对底层XAML概念的熟悉程度,您可能已经在基本应用程序XAML中使用了类型转换行为而未实现它。例如,WPF定义了数百个类型值的属性。一个是描述二维坐标空间的坐标值,它实际上只是有两个重要的属性:XY.在XAML中指定一个点时,将其指定为在您提供的XY值之间带有分隔符(通常为逗号) )的字符串。例如:<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">。即使是这种简单类型的Point及其在XAML中的简单用法也涉及一种类型转换器。在这种情况下,这是类型转换器类PointConverter

    在类级别定义的的类型转换器简化了采用的所有属性的标记用法如果没有类型转换器,您需要为前面显示的相同示例提供以下更详细的标记

    <LinearGradientBrush>

       <LinearGradientBrush.StartPoint>

           <Point X="0" Y="0"/>

       </LinearGradientBrush.StartPoint>

       <LinearGradientBrush.EndPoint>

          <Point X="1" Y="1"/>

       </LinearGradientBrush.EndPoint>

    </LinearGradientBrush>

    是否使用类型转换字符串或更详细的等效语法通常是编码样式选择。您的XAML工具工作流程也可能会影响值的设置方式。一些XAML工具倾向于发出最详细的标记形式,因为它更容易往返于设计器视图或其自身的序列化机制。

    通常可以通过检查类(或属性)是否存在应用的TypeConverterAttribute来在WPF和.NET Framework类型上发现现有类型转换器。对于XAML目的以及可能的其他目的,此属性将为该类型的值命名该类,该类是支持类型转换器。

    键入转换器和标记扩展

    标记扩展和类型转换器根据XAML处理器行为及其应用的方案填充正交角色。尽管上下文可用于标记扩展使用,但标记扩展提供值的属性的类型转换行为通常不会在标记扩展实现中进行检查。换句话说,标记即使扩展报道查看一个字幕:字符串作为其ProvideValue输出,也不会调用该字符串上应用于特定属性或属性值类型的类型转换行为。通常,标记扩展的目的是处理字符串并返回一个没有涉及任何类型转换器的对象

    需要标记扩展而不是类型转换器的一种常见情况是引用已存在的对象。最好的情况是,无状态类型转换器只能生成一个新实例,这可能是不可取的。有关标记扩展的更多信息,请参阅Markup Extensions和WPF XAML

    本机类型转换器

    在XAML解析器的WPF和.NET Framework实现中,某些类型具有本机类型转换处理,但不是通常被认为是基元的类型。这种类型的一个例子是DateTime。其原因在于.NET Framework体系结构的工作原理:DateTime类型在mscorlib中定义,mscorlib是.NET中最基本的库。不允许将DateTime归因于来自引入依赖项的另一个程序集的属性(TypeConverterAttribute来自系统)因此不能支持通过归属的通常类型转换器发现机制。相反,XAML解析器具有需要此类本机处理的类型列表,并且处理这些类型与处理真实基元的方式类似。(在日期时间的情况下,这涉及对解析的调用。)

    实现类型转换器

    类型转换器

    在前面给出的示例中,提到了PointConverter类。对于XAML的.NET实现,用于XAML目的的所有类型转换器都是从基类的TypeConverter 派生的类。该类型转换器在它之前XAML存在的.NET框架的版本中存在类; 它对于XAML,TypeConverter的作用扩展为包括作为to-string和from-string转换的基类,这些转换允许解析字符串属性值,并可能将特定对象属性的运行时值处理回字符串以作为属性进行序列化

    类型转换器定义了四个与XAML处理目的的字符串转换相关的成员:

    其中,最重要的方法是ConvertFrom。此方法将输入字符串转换为所需的对象类型。严格地说,ConvertFrom方法可以实现将更广泛的类型转换为转换器的预期目标类型,从而达到使之能够达到XMAL功能之外的目的,例如支持运行时转换,但是对于XAML目的,它只是代码路径可以处理重要的字符串输入。

    下一个最重要的方法是ConvertTo。如果将应用程序转换为标记表示(例如,如果将其作为文件保存到XAML),则ConvertTo负责生成标记表示。在这种情况下,对于XAML重要的代码路径是你当传递destinationType字符串

    CanConvertToCanConvertFrom是服务查询类型转换器实现的功能时使用的支持方法。必须您实现这些方法以报道查看true转换器请立即获取iTunes的等效转换方法的特定于类型的情况。对于XAML目的,这通常表示字符串类型。

    XAML的文本信息和类型转换器

    每个TypeConverter实现都可以自己解释构成转换的有效字符串的内容,也可以使用或忽略作为参数传递的类型描述。关于培养和XAML类型转换有一个重要的考虑因素.XAML完全支持使用可本地化的字符串作为属性值。但是不支持将可本地化的字符串用作具有特定区域性要求的类型转换器输入,因为XAML属性值的类型转换器涉及使用en-USculture的必要的固定语言分析行为。限制的设计原因的更多信息,请参阅XAML语言规范([MS-XAML])。

    举一个作为文本信息可能成为问题的一个例子,一些文本使用逗号作为数字的小数点分隔符。这将与许多WPF XAML类型转换器具有的行为相冲突,即使用逗号作为分隔符(基于历史先例,例如常见的X,Y形式或逗号分隔列表)。即使在周围的XAML中传递文本(设置Language或字幕:,这种以使用方式为逗号十进制xml:langsl-SI字幕:的例子)也无法解决问题。

    实现ConvertFrom

    要实现XAML的TypeConverter,该转换器的ConvertFrom方法必须接受字符串作为value参数。如果字符串格式有效,并且可以通过TypeConverter实现进行转换,则返回的对象必须支持转换为属性所需的类型。否则,ConvertFrom实现必须返回null

    每个TypeConverter实现都可以自己解释构成转换的有效字符串的内容,也可以使用或忽略作为参数传递的类型描述或文化上下文。但是,WPF XAML处理可能不会在所有情况下将值传递给类型描述上下文,也可能不会传递基于文本的文本xml:lang

     注意

    不要使用大括号字符,特别是{,作为字符串格式的基本元素。这些字符保留为标记扩展序列的入口和出口。

    实现的ConvertTo

    的ConvertTo用于序列化支持。通过的ConvertTo为您的自定义类型及其类型转换器提供的序列化支持不是绝对必需的。但是,如果要实现控件,或者使用序列化作为类的功能或设计的一部分,则应实实现ConvertTo

    要实现XAML的TypeConverter,该转换器的ConvertTo方法必须接受作为value参数支持的类型(或值)的实例。当destinationType参数是String类型时,返回的对象必须能够转换为String。返回的字符串必须表示序列化值value。理想情况下,如果将该字符串传递给同一转换器的ConvertFrom实现,则您选择的序列化格式应该能够生成相同的值,而不会显着丢失信息。

    如果该值无法序列化,或者转换器不支持序列化,则的ConvertTo实现必须返回null,并且在这种情况下允许抛出异常。但是,如果您确实抛出异常,则应该报告无法将该转换用作CanConvertTo实现的一部分,以便支持首先使用CanConvertTo检查以避免异常的最佳做法。

    如果destinationType参数不是字符串类型,则可以选择自己的转换器处理。通常,您将恢复到基本实现处理,在最基本的的ConvertTo中会引发特定的异常。

    实现CanConvertTo

    CanConvertTo实现应返回truedestinationType类型的String,否则推迟到基本实现。

    实现CanConvertFrom

    CanConvertFrom实现应返回truesourceType类型的String,否则推迟到基本实现。

    应用TypeConverterAttribute

    为了将自定义类型转换器用作XAML处理器的自定义类的代理类型转换器,必须将.NET Framework属性TypeConverterAttribute应用于类定义。通过该属性指定的ConverterTypeName必须是自定义类型转换器的类型名称。应用此属性后,当XAML处理器处理属性类型使用您的自定义类类型的值时,它可以输入字符串并返回对象实例。

    您还可以基于每个属性提供类型转换器。不是将.NET Framework属性TypeConverterAttribute应用于类定义,而是将其应用于属性定义(主要定义,而不是其中的getset实现)。属性的类型必须与自定义类型转换器处理的类型匹配。应用此属性后,当XAML处理器处理该属性的值时,它可以处理输入字符串并返回对象实例。如果您选择使用微软.NET Framework中的属性类型或某其他无法控制类定义且无法在其中应用TypeConverterAttribute,则每个属性类型转换器技术特别有用

    WPF XAML扩展

      1.绑定标记扩展

    绑定表达式用法

    <object property="{Binding}" .../>  
    或  
    <object property="{Binding  bindProp1=value1[, bindPropN=valueN]*}" ...  
    />  
    或  
    <object property="{Binding path}" .../>  
    或 
    <object property="{Binding path[, bindPropN=valueN]*}" .../>

    语法注释

    在上面的实例中,[]*不是文字。它们是表示可以使用零个或多个bindProp =value的表示形式的一部分,在bindProp =value等式之间用分隔符“,”分开。可以使用Binding对象元素的属性来设置“可以使用绑定扩展设置的绑定属性”部分中列出的任何属性。但是,这并不是Binding的标记扩展使用,它只是设置CLR Binding类属性的属性的一般XAML处理。换句话说,<Binding bindProp1 ="value1 "[ bindPropN ="valueN"]*/>Binding对象元素用法的属性的等效语法,而不是Binding表达式用法。要了解Binding的特定属性的XAML属性用法,请参阅相关属性的“XAML属性用法”部分。在.NET Framework类库中Binding

    XAML值

      
    bindProp1, bindPropN要设置的BindingBindingBase属性的名称。并非所有Binding属性都可以使用Binding扩展名设置,并且某些属性Binding只能通过使用其他嵌套标记扩展名在表达式中设置。请参见“可以使用绑定扩展设置的绑定属性”部分。
    value1, valueN要将属性设置为的值。属性值的处理最终特定于所设置的特定Binding属性的类型和逻辑。
    path设置隐式Binding.Path属性的路径字符串。另请参见PropertyPath XAML语法

     

    不标准用法{Binding}

    {Binding}在上个例子所示的使用创建一个使用默认值对象的Binding,它令Binding.Path的初始值为null。这在许多场景中仍然有用,因为创建的Binding可能依赖于关键数据绑定属性,例如在运行时数据上下文中设置的Binding.PathBinding.Source。有关数据上下文概念的更多信息,请参阅Data Binding

    隐含路径

    Path=不需要出现在表达式的地方,该Binding标记扩展使用Binding.Path作为一个概念上“默认属性”。如果指定Binding具有一个隐式路径的表达式,则隐式路径必须出现在表达式的首部,在其他bindPropvalue等式之前,其中Binding属性由名称指定。例如:{Binding PathString},这里PathString是一个字符串,其被转换为由标记扩展使用创建的Binding中Binding.Path的值。例如,您可以在逗号分隔符后面附加其他命名属性的隐式路径。 {Binding LastName, Mode=TwoWay}

    可以使用绑定扩展设置的绑定属性

    本主题中显示的语法使用通用bindProp = value近似值,因为可以通过标记扩展/表达式语法设置BindingBaseBinding许多读/写属性Binding。它们可以按任何顺序设置,但隐式Binding.Path除外。(您可以选择显示指定Path=,在这种情况下,可以按任何顺序设置)。基本上,您可以使用以逗号分隔的bindPropvalue对在下面的列表中设置零个或多个属性。

    其中一些属性值需要不支持XAML中的文本语法的本机类型转换的对象类型,因此需要标记扩展才能设置为属性值。有关详细信息,请查看.NET Framework类库中的XAML属性用法部分以获取每个属性; 您使用XAML属性语法有或没有进一步的标记扩展使用的字符串是基本一样的,你在一个指定的值Binding表达式,与您不要将围绕每个引号异常bindPropvalueBinding表达。

    以下是无法使用标记扩展/ 表达式形式设置的Binding属性。 Binding{Binding}

       类型标记扩展

    • x:Type 命名为类型提供  类型。对象此工具最常用于样式和模板有关详细信息,请参阅  X:类型标记扩展

    • x:Static 。产生静态值值来自值类型代码实体,它们不是目标属性值的类型,但可以计算为该类型有关详细信息,请参阅  X:静态标记扩展

      <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />  
      <!--在此用法中,x:Static首先计算语句SystemColors.ControlBrushKey然后返回一个字符串。然后将该字符串用作DynamicResourced的参数-->

       

    • x:Null 指定  null 为属性的值,可以用于属性或属性元素值有关详细信息,请参见  .X:空标记扩展

    • x:Array 如果故意不使用WPF基本元素和控件模型提供的集合支持,则支持在XAML语法中创建通用数组有关详细信息,请参见  .X:阵列标记扩展

    • WPF特定的标记扩展

      WPF编程中使用的最常见的标记扩展是那些支持资源引用(StaticResource 和  DynamicResource)以及支持数据绑定(Binding)的扩展。

    • StaticResource 通过替换已定义资源的值来为属性提供值。   StaticResource 在XAML加载时最终生成,并且不能够在运行时访问该对象。有关详细信息,请参阅  的静态资源的的标记扩展

    • DynamicResource 为属性提供一个运行时引用的资源值。每次访问此类资源时,动态资源引用都会强制执行新查找,并且在运行时可以访问对象图。为了获得此访问权限,  DynamicResource 概念由WPF属性系统中的依赖项属性和计算表达式支持。因此,您只能  DynamicResource 用于依赖项属性目标。有关详细信息,请参阅  DynamicResource标记扩展

    • Binding 使用在运行时父应用于对象的数据上下文为属性提供数据绑定值此标记扩展相对复杂,因为它。请|立即的的的iTunes中的电子杂志用于指定数据绑定。的实质内联语法有关详细信息,请参阅  绑定标记扩展

    • RelativeSource 提供可以在运行时对象树中导航几种可能关系的绑定的源信息。这为在多用途模板中创建的绑定提供了专门的源代码,或者在不完全了解周围对象树的情况下在代码中被创建。有关详细信息,请参阅  RelativeSource MarkupExtension

    • TemplateBinding 使控件模板能够使用来自将使用模板的类的对象模型定义属性的模板化属性的值。换句话说,模板定义中的属性可以访问仅在应用模板后才存在的上下文。有关详细信息,请参阅  TemplateBinding标记扩展。有关实际使用的更多信息  TemplateBinding,请参阅  使用CONTROLTEMPLATES示例进行样式设置

    • ColorConvertedBitmap 支持相对先进的成像方案。有关详细信息,请参阅  ColorConvertedBitmap标记扩展

    • ComponentResourceKey 并且  ThemeDictionary 支持资源查找的各个方面,特别是对于使用自定义控件打包的资源和主题。有关更多信息,请参阅  ComponentResourceKey标记扩展,  ThemeDictionary标记扩展或  控制创作概述

    展开全文
  • XAML 界面原理与语法

    万次阅读 2018-08-06 20:26:33
    Windows 10 应用程序中的界面是由xaml 文件组成的,和这些xaml文件一一对应起来的是xaml.cs文件,这就是微软典型的Code-Behind模式的编程方式。Xaml文件的语法类似XML和HTML的结合体,这是微软的XA...

    XAML(Extensible Application Markup Language),是用于实例化.NET对象的标记语言。XAML是微软技术体系中的UI编程语言。Windows 10 应用程序中的界面是由xaml 文件组成的,和这些xaml文件一一对应起来的是xaml.cs文件,这就是微软典型的Code-Behind模式的编程方式。Xaml文件的语法类似XML和HTML的结合体,这是微软的XAML语言特有的语法结构。

    理解XAML

    XAML是一种声明性标记语言,它简化了为.NET Framework应用程序创建UI的过程,使程序界面编程更加简单和简洁。XAML直接以程序集中定义的一组特定后备类型表示对象的实例化。XAML文件中的每个元素代表.NET中的一个类,并且XAML文件中的每个属性代表.NET类中的一个属性、方法或事件。后台文件.xaml.cs中部分类包含了XAML呈现层可以用的事件、方法和属性。

    编写XAML代码是需要注意,声明一个XAML元素时,可以用Name属性为该元素指定一个名称,这样在C#代码里面才可以访问到此元素。

    XAML必须遵循的4大原则:

    1. XAML是大小写区分的,元素和属性的名称必须严格区分大小写。
    2. 所有的属性值,无论它是什么数据类型,都必须包含在双引号中;
    3. 所有的元素都必须是封闭的;如<Button …/> <Button>…</Button>
    4. 最终的XAML文件也必须是合适的XML文档。

    XAML语法

    1.命名空间

    XAML里面的元素对应着.NET里面的类,但是只提供类名是不够的,XAML解析器还需要知道这个类位于哪个.NET名称空间,这样解析器才能够正确的识别XAML的元素。

    xmlns特性是XML中的一个特殊特性,它专门用来声明命名空间。一旦声明一个命名空间,在文档中的任何地方都可以使用该命名空间。

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    是Windows 10 的核心命名空间。包含了大部分用来构建用户界面的控件类。该名称空间的声明没有使用命名空间前缀,所以他成为整个文档的默认命名空间。所以没有前缀的元素都是自动位于这个命名空间下。

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    它包含了XAML的实用特性。该名称空间被映射为前缀为x。

     

    XML命名空间的名称和任何特定的.NET名称空间都不匹配。这种设计的原因有以下两个。

    第一个原因:XML命名空间通常是URI。这些URI开起来像是在指定Web上的位置,但实际不是。通过使用URI格式的命名空间,不同的XML文档格式就会互相区分开来,作为唯一的标识符,表示这是创建在某个特定环境下的XML文档。

    第二个原因:XAML中使用的XML命名空间和.NET命名空间不是一一对应的,如果一一对应的花,会显著增加XAML文档的复杂程度。XAML将这些.NET命名空间组合到单个XML命名空间中。

    2.对象元素

    XAML的对象元素是指XAML中的一个完整的节点,一个XAML文件始终只有一个根元素,在Windows 10 里面通常是Page作为根元素,其他都是子元素。子元素可以包含一个或多个子元素。

    对象元素语法是一种XAML标记语法,它通过声明XML元素将Windows 10 的类或结构实例化。对象元素以左尖括号(<)开始,后面紧跟要实例化的类或结构的类型名称。类型名称后面可以有零个或多个空格,对于对象元素还可以声明零个或多个特性,并用一个或多个空格来分隔每个"特型名=值"这样的属性对。

    3.设置属性

    XAML中的属性也可以使用多种语法设置,不同的属性类型也会有不同的设置方式,并不是全部的属性设置都是通用的,总的来说可以通过下面的4种方式来设置对象元素的属性:

    1.使用属性语法;

    <objectName propertyName = "propertyValue" … />

    2.使用属性元素语法;

    <Object>

              <Object.property>

              PropertyValueAsObjectElement

              </Object.property>

    </Object>

    3.使用内容元素语法;

    4.使用集合语法(通常是隐式集合语法)。

     

    并不是所有属性都适用取决于属性对象的特性。

    4.附加属性

    附加属性是一种特定类型的属性,和普通属性的作用并不一样。这种属性的特殊之处在于,其属性值受到XAML中专用属性系统的跟踪和影响。附加属性可用于多个控件,但却在另一个类中定义。常用于控件布局。

    5.标记扩展

    标记扩展是一个被广泛使用的XAML语言概念。通过XAML标记扩展来设定属性值。从而可以让对象元素的属性具备更加灵活和复杂的赋值逻辑。常用的有以下五种:

    1. Binding(绑定)标记扩展,实现在XAML载入时,将数据绑定到XAML对象;
    2. StaticResource(静态资源)标记扩展,实现引用数据字典(ResourceDictionary)中定义的静态资源。
    3. ThemeResource(主题资源)标记扩展,表示系统内置的静态资源。
    4. TemplateBinding(模板绑定)标记扩展,是现在XAML页面中,对象模板板顶调用。
    5. RelativeSource(绑定关联源)标记扩展,实现对特定数据源的绑定。

    在语法上,XAML使用大括号{}来表示扩展。例如:

    <TextBlock Text = "{Binding Source = {StaticResource myDataSource}, Path = PersonName}"/>

    这里有两处使用了XAML扩展,一处是Banding,另一处是StaticResource,这种用法称为嵌套扩展,TextBlock元素的Text属性的值为{}中的结果。当XAML编译器看到大括号{}时,把大括号中的内容解释为XAML标记扩展。

    XAML本身也定义了一些内置的标记扩展,这类扩展包括:

    x:Type:在XAML中取对象的类型,相当于C#中的typeof操作,这种操作发生在编译的时候。

    x:Static:是用来把某个对象中的属性或域的值赋给目标对象的相关属性。

    x:null:是一种最简单的扩展,自作用就是把目标的属性设置为null。

    x:Array:表示一个.NET数组。x:Array元素的子元素都是数组元素,它必须与x:Type一起使用,用于定义数组类型。

    6.事件

    大多数Windows 10 应用都是由标记和后台代码组成,在一个项目中,XAML作为.xaml文件来编写,然后用C#语言来编写后台代码文件。当XAML文件被编译时,通过XAML页面的根元素的x:Class属性指定的命名空间和类来表示每个XAML页对应的后台代码的位置。事件是XAML中常用的语法。

    事件在XAML中的基础语法如下:

    <元素对象 事件名称 = "事件处理"/>

    XAML原理

    1.XAML页面的编译

    通过Visual Studio完成XAML页面的编译,在程序运行时会通过直接链接操作加载和解析XAML,将XAML和过程代码自动连接起来。用户不需要将XAML文件和过程代码融合,只需要将它添加到项目中,通过Build动作完成编译。

    通常把与XAML文件关联的XAML.CS文件称为代码隐藏文件。如果在XAML添加任何一个时间处理程序,在XAML.CS上就会生成时间的处理代码。在类定义中有一个 partial 关键字,这个关键字很重要 ,因为类的实现是分布在多个文件中的。因为在项目里面看到 MainPage.xaml.cs 文件定义了MainPage类,其实在另一个地方也定义了,只是在项目工程里面隐藏了。当编译完  Windows 10 项目时,会在项目的obj\Debug文件夹下看到Visual Studio 创建的以g.cs为扩展名的文件,对于每一个XAML文件,可以找到一个对应的g.cs文件。

    从.g.cs文件中可以看到MainPage类还定义了一些控件和相关的方法,并且InitializeComponent()方法里面加载和解析了MainPage.xaml文件。在xaml页面中声明的控件,通常会在.g.cs中生成相应的控件的内部不字段。取决于控件是否有x:Name属性。

    在项目的obj\Debug文件夹下,还有g.i.cs为扩展名的文件,这些文件并不是在编译的时候生成的,而是当创建了XAML文件的时候就马上生成,或者修改了XAML文件g.i.cs文件也会跟着改变,而g.cs文件则是必须要成功变了项目之后才会生成的。

    g表示generated产生的意思

    i表示intellisense智能感知的意思

    2.动态加载XAML

    动态加载XAML是指在程序运行时通过解析XAML格式的字符创或者文件在动态生成UI的效果。

    在应用程序里面动态加载XAML需要使用到XamlReader.Load方法来实现,XamlReader类是为分析XAML和创建相应的windows 10 对象树提供XAML处理器引擎,XamlReader.Load方法可以分析格式良好的XAML片段并创建相应的Windows 10 对相树,然后返回该对象树的根。大部分可以在XAML页面中编写代码,都可以通过动态加载XAML的形式来实现,不仅仅是普通的UI控件,动画等其他的XAML代码一样可以动态加载。

    动态加载XAML对XAML的字符串有一定的要求:

    1. XAML内容字符串必须定义当个根元素,使用XamlReader.Load创建的内容只能赋予一个 Windows 10 对象,它们是一对一的关系。
    2. 内容字符串XAML必须是格式良好的XML,并且必须是可分析的XAML。
    3. 所需的根元素还需要指定某一默认的XML命名空间值。这通常是命名空间

    xmls=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”

    例:

    MainPage.xaml

    <StackPanel x:Name="sp_show">
              <Button x:Name="bt_addXAML" Content="加载xaml按钮" Click="bt_addXAML_Click">
              </Button>
    </StackPanel>

    MainPage.xaml.cs

            private void bt_addXAML_Click(object sender, RoutedEventArgs e)
            {
                string buttonXAML = "<Button xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'" +
                    " Content = \"加载XAML文件\" Foreground=\"Red\" ></Button>";
                Button btnRed = (Button)XamlReader.Load(buttonXAML);
                btnRed.Click += btnRed_Click;
                sp_show.Children.Add(btnRed);
            }
            async void btnRed_Click(object sender, RoutedEventArgs e)
            {
                string xaml = string.Empty;
                StorageFile fileRead = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync("Rectangle.xaml");
                xaml = await FileIO.ReadTextAsync(fileRead);
    
                Rectangle rectangle = (Rectangle)XamlReader.Load(xaml);
                sp_show.Children.Add(rectangle);
            }
    

    Rectangle.xaml 修改属性为Content

    <Rectangle 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                Height="100" Width="200">
        <Rectangle.Fill>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                <GradientStop Color="Black" Offset="0" />
                <GradientStop Color="Red" Offset="0.5" />
                <GradientStop Color="Black" Offset="1" />
            </LinearGradientBrush>
        </Rectangle.Fill>
    </Rectangle>
    

    XAML树结构

    XAML是界面编程语言,用来呈现用户界面,它具有层次化的特性,它的元素的组成就是一种树的结构类型。XAML编程元素之间通常以某种形式的“树”关系存在,它XAML中创建的应用程序UI可以抽象一个对象树,也称元素树,可以进一步将对象树分为两个离散但有时会并行的树:逻辑树和可视化树。

    逻辑树:是根据父控件和子控件来构造而成的,在路由事件中将会按照这样的一种层次结构来触发。

    可视化树是XAML中可视化空间极其子控件组成的一个树形的控件元素结构图。

    1.可视化树

    可视化树中包含应用程序的用户界面所使用的所有可视化元素,并通过了树形的数据按照父子元素的规则来把这些可视化元素排列起来。可视化树概念指的是较大的对象树经过编辑或筛选后的表示形式。所应用的筛选器是在可视化树中只存在具有呈现含义的对象。

    通过可视化树,可以确定Windows 10 可视化对象和绘图对象的呈现顺序。从顶层元素根开始遍历,然后按照从左到右的顺序遍历。先遍历子级,后遍历同级。

    2.VisualTreeHelper类

    可视化树针对XAML的现实操作实在应用程序内部使用。编写或替换控制模板或在运行时分析控件的结构或部分。

    VisualTreeHelper类常用的静态方法

    FindElementsInHostCoordinates

    GetChild

    GetChildrenCount

    GetParent

    遍历可视化树

            <StackPanel x:Name="stackPanel">
                <TextBlock>我的应用程序</TextBlock>
                <TextBlock>xxx</TextBlock>
                <Rectangle Height="20" StrokeThickness="2" Stroke="Black" ></Rectangle>
                <TextBlock></TextBlock>
                <Button Content="遍历"  Click="Button_Click"></Button>
            </StackPanel>
    

         

            string visualTreeStr = string.Empty
            private async void Button_Click(object sender, RoutedEventArgs e)
            {
                visualTreeStr = "";
                GetChildType(stackPanel);
                MessageDialog messageDialog = new MessageDialog(visualTreeStr);
                await messageDialog.ShowAsync();
    
            }
            public void GetChildType(DependencyObject reference)
            {
                int count = Windows.UI.Xaml.Media.VisualTreeHelper.GetChildrenCount(reference);
                if(count > 0)
                {
                    for (int i = 0; i  <= Windows.UI.Xaml.Media.VisualTreeHelper.GetChildrenCount(reference) - 1; i++)
                    {
                        var child = Windows.UI.Xaml.Media.VisualTreeHelper.GetChild(reference, i);
                        visualTreeStr += child.GetType().ToString() + " " + count + " ";
                        GetChildType(child);
                    }
                }
    
            }
    

    框架和页面

    Windows 10 的应用程序里面包含一个框架多个页面,框架相当于是应用程序的最外层的一个容器,然后这个容器里面包含了很多个页面。这些页面都是存在于导航堆栈上。

    Windows 10 应用程序平台提供了框架和页面类,框架类为Frame,页面类为Page。Windows 10 应用程序的框架是一个顶级容器控件,该控件可托管Page,page页面有包含应用程序中不同部分的内容,也就是程序界面UI的内容。在Windows 10 里面可以创建任何数目的页面。

    在App.xaml.cs页面包含下面的代码:

    Frame rootFrame = Window.Current.Content as Frame;

    Windows 类的单利对象的Content属性就是当前Windows 10 应用程序最顶层的元素,应用程序的主框架,一个Windows 10 应用程序只有一个主框架,Window.Current.Content属性的值是与应用关联的Frame,每个应用都有一个Frame。当用户导航到该页面时,导航框架会将应用的每个页面或Page的实例设置为框架的Content。

    this.Frame.Navigate(typeof(BlankPage1));

    展开全文
  • XAML界面搭建

    2019-08-08 14:32:18
    作者:李嘉乐 撰写时间:2019年8月8日
  • xaml

    2021-03-13 16:13:39
    二、 窗口修饰控件 1、 Menu控件,菜单控件,相信大家都不陌生,先看下面的xaml: 显示的界面: 由此可以看出,菜单控件是利用MenuItem子项形成层级结构,并且可以为每一个菜单项设置Click事件。上面实例没有设置...
  • XAML界面设计

    千次阅读 2019-02-23 17:50:03
    2、下面是XAML界面的代码(图2—图5),一些代码的用法已经有注悉说明。 图2   图3   图4   图5   3、下面是运行后的效果图 4、下面是点击‘开始’按钮后再点击‘暂停...
  • xaml实现无边框窗口

    2019-10-08 11:53:18
    Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns...
  • Xaml

    2009-11-19 21:59:00
    首先在使用WPF时并不一定要使用Xaml,每一件Xaml能做的事情可以用任何...但很少有使用WPF而不是用Xaml的情况,因为Xaml有它的好处: *用最简单的方式表示用户界面与对象关系 *使得程序界面与后台逻辑分离。也就是说...
  • private void ButtonGo_camerapage(object sender, RoutedEventArgs e) { this.Content = new cameraPage();//cameraPage是我要跳转到的新XAML界面的名称 } 转载于:https://www.cnblogs.com/E...
  • 自从 WPF 推出以后,很多用 .NET 的童鞋以为 XAML 是 WPF 专用的界面描述语言。其实不然,XAML 是一种专门用于“对象图实例化并设置初始值”的 XML 方言,跟 C# 之类全功能的语言不同,XAML 专攻对象的创建和属性...
  • 该工具窗口使检测和了解XAML中通常会隐藏在输出窗口中的绑定失败变得更加容易。 目前,我正处于原型开发阶段,因为我确定了对用户最有用的功能。 反馈表示赞赏! 当前支持的框架: WPF for .NET Framework .NET ...
  • WPF动态界面范例,XAML界面

    热门讨论 2009-05-09 20:57:50
    微软WPF程序动态界面范例,采用Expression Blend开发界面,简单的程序
  • 兽人功能切换 姓名 徽章 聊天 资料下载 稳定版 不稳定版本 功能切换是WPF组件,可以帮助您管理功能切换。 有关文档,请访问
  • Xamarin XAML语言教程将XAML设计的UI显示到界面 如果通过XAML将UI设计好以后,就可以将XAML中的内容显示给用户了,也就是显示到界面上。由于创建XAML文件方式的不同,所以将XAML中的内容显示到界面上的方式也就不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,686
精华内容 11,474
关键字:

xaml的登录窗口