代码改变世界

Silverlight之XAML学习和一行崩溃VS的代码

2010-09-06 22:12  撞破南墙  阅读(1926)  评论(5编辑  收藏  举报

想知道如何一行代码崩溃VS点我链接去

 

 1XAML 文件几乎始终在其根元素中声明一个默认的 XAML 命名空间。默认 XAML 命名空间定义可以声明哪些元素,而无需通过前缀进一步进行限定。例如,如果您声明一个元素 <Balloon />,则该元素 Balloon 应存在且在默认 XAML 命名空间中有效。相反,如果 Balloon 不在所定义的默认 XAML 命名空间中,则您必须转而使用一个前缀来限定该引用,例如,<party:Balloon />。该前缀指示此实体存在于与默认命名空间不同的 XAML 命名空间中,尤其是,您已将某个 XAML 命名空间映射到前缀 party 以便于使用。

 2

x: 前缀/XAML 语言 XAML 命名空间包含多个将在 Silverlight XAML 中频繁使用的编程构造。下面列出了最常见的 x: 前缀/XAML 命名空间构造:

x:Key为 ResourceDictionary 中的每个资源设置一个唯一键。

x:Class指定为 XAML 页提供代码隐藏的类的 CLR 命名空间和类名称,并命名由标记编译器在 Silverlight 应用程序模型中创建的类

x:Name处理 XAML 中定义的对象元素后,为运行时代码中存在的实例指定运行时对象名称。对于不支持更为方便的 FrameworkElement..::..Name 属性的非常见情形,您可以将 x:Name 用于元素命名方案。

 

XAML 语言 XAML 命名空间中还有其他一些不太常见的编程构造。有关详细信息,请参见 XAML 命名空间 (x:) 语言功能。{

x:Class 属性

配置 XAML 编译以便在标记与代码隐藏之间联接分部类。

x:Key 属性

唯一地标识作为资源创建和引用且存在于 ResourceDictionary 中的元素。

x:Name 属性

唯一标识对象元素,以便从代码隐藏或通用代码访问实例化的对象。

x:Null 标记扩展

将 null 指定为通过 XAML 属性 (Attribute) 设置的属性 (Property) 的值。

}

 

3标记扩展

Silverlight 支持在其默认的 Silverlight XAML 命名空间下定义且其 XAML 分析器可以理解的以下标记扩展。 

绑定:支持数据绑定,此绑定将延迟属性值,直至在数据上下文中解释此值。 

  • StaticResource支持引用在 ResourceDictionary 中定义的资源值。 
  • TemplateBinding支持 XAML 中可与模板化对象的代码属性交互的控件模板
  • RelativeSource启用特定形式的模板绑定

RelativeSource:{提供一种方法,以便根据运行时对象图中的相对关系指定绑定的源。

TemplatedParent 模式用于数据验证方案,其中,模板可以为运行时发生的错误处理建立 UI。有关此验证类型的详细信息,请参见 Validation 或数据绑定

Self 模式用于以下情况:同一个元素应用作绑定的源对象和目标对象,但源和目标的属性各不相同。这对于将元素的一个属性绑定到同一元素的另一个属性非常有用,并且这是 ElementName 绑定的一个变体,不需要命名以及然后自引用此元素。如果您将元素的一个属性绑定到同一个元素的另一个属性,则这两个属性必须使用相同的属性类型,否则,您还必须对绑定使用 Converter 来转换值。

TemplatedParent 获取一个对此元素的模板父级的引用。如果此元素不是通过模板创建而成,则此属性并不相关

}

 

4 用于 Silverlight 的 XAML 文件,它们定义前缀 d:(对于设计器命名空间)和 mc:(用于实现标记兼容)。

 

5文本"{" 

因为左大括号符号 是标记扩展序列的开始标记,所以,您必须使用转义符序列,以便指定以 开头的文本字符值。转义序列是 {}。例如,若要指定作为单个左大括号的字符值,请将属性值指定为 {}{。您还可以在某些情况下使用替代引号(例如,"" 分隔的属性值内的 '),以便将 值作为字符串提供。

 

6TypeConverter 和 XAML 

http://msdn.microsoft.com/zh-cn/library/cc645047(v=VS.95).aspx 

 

XAML 名称范围 

7如何定义 XAML 名称范围

通常,将在 XAML 中指定的每个名称添加到默认 XAML 名称范围,该名称范围与提供的 XAML 标记中的根元素关联。因此,在本文档中此 XAML 名称范围一般是指根 XAML 名称范围。 

2在运行时使用 XAML 名称范围
名称在 Silverlight 的 XAML 名称范围中的最典型用途是作为对对象实例的直接引用,而该实例由与在分部类模板中生成的InitializeComponent 方法结合在一起的标记编译处理过程启用。

您自己还可以在运行时使用实用工具方法 FindName 来返回对对象的引用,这些对象是用 XAML 标记中的名称定义的。

Silverlight 中已命名 XAML 元素的直接引用的工作原理

您可以在编译后通过在 Silverlight 托管项目的 /obj 子文件夹中查看为每个 XAML 页创建的".g"(生成的)文件,来自己查看此基础结构。 

MainPage.g.i.cs  文件中的部分代码

 

 

public partial class MainPage : System.Windows.Controls.UserControl {

internal System.Windows.Controls.Grid LayoutRoot;

internal System.Windows.Controls.Button button1;

private bool _contentLoaded;

/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded
= true;
System.Windows.Application.LoadComponent(
this, new System.Uri("/FPE;component/MainPage.xaml", System.UriKind.Relative));
this.LayoutRoot = ((System.Windows.Controls.Grid)(this.FindName("LayoutRoot")));
this.button1 = ((System.Windows.Controls.Button)(this.FindName("button1")));
}
}

 

 

 

8使用 XamlReader.Load 创建名称范围 

使用findanme 查找可能出现问题. 

解决办法

@1使用 Parent 和/或对象树结构中已知存在的集合属性在分离的步骤中执行整个树(例如,由 Panel.Children 返回的集合)。

@2如果从独立 XAML 名称范围进行调用并希望得到根 XAML 名称范围 ./在其中一行代码中使用调用 Application.Current.RootVisual 然后可以强制转换到 FrameworkElement 并从此范围调用 FindName

@3如果从根 XAML 名称范围进行调用并希望得到独立 XAML 名称范围内的对象,则最佳做法是在代码中提前进行计划并保留对由 XamlReader.Load(String) 返回的对象的引用,然后添加到主对象树中。现在,此对象对于在独立 XAML 名称范围内调用 FindName 是有效的对象。可以将此对象保持为全局变量,否则使用方法参数传递它。

通过检查可视化树,可以不需要考虑名称和 XAML 名称范围。借助于 VisualTreeHelper API,您可以完全根据位置和索引,依据父对象和子集合遍历可视化树。

 

9模板中的 XAML 名称范围
模板的每个实例化都有其自已的 XAML 名称范围,因此在本示例中每个实例化模板的 XAML 名称范围都只包含一个名称 

由于具有独立的 XAML 名称范围,因此,在应用模板的页面范围的模板内查找命名元素需要不同的方法。首先获取已应用了模板的对象,然后调用 GetTemplateChild (protected)

 

10 UserControlsContentControls 和 ItemControls 的 XAML 名称范围

对于要实现模板化的控件(ContentControl 或 ItemsControl),存在一个 TemplatePartAttribute 属性化约定,通过这一约定,在原始模板定义中具有名称的模板的各个部分可在类定义中进行属性化。此约定是给定自定义控件的控件协定的一部分。对于这些情况,已经有一个断开连接的名称范围,因为该模板定义其自己的名称范围。要使用该名称范围,需要一个调用 GetTemplateChild 的 OnApplyTemplate 重写。

对于 UserControl,在定义 XAML 中没有等效的模板部件属性约定可用于 UserControl 的各个部件,也根本没有应用的模板。然而,定义与用法之间的名称范围仍保持断开连接状态,因为当您将 UserControl 打包成程序集以供重用时,定义了定义名称范围,然后有效地对其进行了密封。此时的最佳做法是定义您的 UserControl,以便将修改定义 XAML 时所需设置的任何值也公开为 UserControl 的一个公共属性。

 

11使用 JavaScript API 时的名称和 XAML 名称范围
由于没用JavaScript做过东西,不太看得懂。

 

 

12Silverlight 和 XAML 语言 XAML 命名空间声明 

打开XAML界面 

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

将 Silverlight 核心 XAML 命名空间映射为默认命名空间 

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

XAML定义的语言元素映射一个单独的 XAML 命名空间,通常将它映射为 x: 前缀

=========以上与 WPF 所使用的默认命名空间相同的 XAML 命名空间。      

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

设计

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

兼容

   xmlns:my1="clr-namespace:Tools;assembly=Tools"

引用类库

 

 

clr-namespace: 在包含要对 XAML 用法公开的公共类型的程序集中声明的公共语言运行时 (CLR) 命名空间。

assembly= 是指包含部分或全部引用的 CLR 命名空间的程序集。

对于   

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

 

访问基于源站点的程序集所需的路径不应包含在映射中。指向程序集的路径仅与 AssemblyPart.Source 值和ExtensionPart.Source 值有关。 

 

 

 

13 使用 XamlReader.Load 

如果使用 Silverlight  JavaScript API,则在运行时创建对象需要使用 CreateFromXaml 实用工具方法。如果使用 Silverlight 的托管 API,则在支持 Silverlight 元素树中存在的元素的类或结构上,可以使用真正的构造函数。在大多数情况下,您希望在运行时构造对象,但您只能调用相关类的构造函数。

由于不用JavaScript 所以跳过

 

Silverlight 命名空间扩展 

<object property="{Binding}" .../>

 

<object property="{Binding propertyPath, oneOrMoreBindingProperties}" 

 />

属性

说明

Path

指定绑定源属性的路径。如上文中“属性路径”一节所指出的那样,您可以通过紧接在Binding 标记扩展的初始部分之后的字符串来建立 Path(例如 {Binding Employee.FirstName});还可以显式指定路径,就像其他指定的 Binding 属性一样(例如,{Binding Path=Employee.FirstName})。

Converter

指定由绑定引擎调用的转换器对象。可以在 XAML 中设置转换器,但仅当您引用的转换器是以可在 XAML 的 ResourceDictionary 中实例化并放入其中的方式定义时才有效。然后,XAML 引用要求在资源字典中具有指向该对象的 StaticResource 引用。

ConverterCulture

指定转换器要使用的区域性。区域性转换器可以设置为基于标准的标识符。有关更多信息,请参见 ConverterCulture 属性。

ConverterParameter

指定可以在转换器逻辑中使用的转换器参数。大多数转换器使用可接受字符串ConverterParameter 值的简单逻辑。在 XAML 中编写使用非字符串的转换器并将对象传递到 ConverterParameter 是一种复杂的情形,此处不进行讨论。有关更多信息,请参见ConverterParameter

Mode

将绑定模式指定为以下字符串之一:OneTimeOneWay 或 TwoWay

Source

指定对象数据源。在 Binding 标记扩展内,Source 属性要求对象引用(例如,StaticResource 引用)。如果未指定此属性,则当前有效的数据上下文将指定源。

NotifyOnValidationError

对绑定启用验证/通知模式。可以为 true 或 false(默认值为 false)。

ValidatesOnExceptions

对绑定启用验证/通知模式。可以为 true 或 false(默认值为 false)。

ValidatesOnDataErrors

对绑定启用验证/通知模式。可以为 true 或 false(默认值为 false)。如果存在以下情况,则不对此属性进行绑定:ValidatesOnExceptions 属性为 true 并且该绑定引发异常。

ValidatesOnNotifyDataErrors

对绑定启用验证/通知模式。可以为 true 或 false(默认值为 true)。

ElementName

通过引用具有 Name 属性或 x:Name 属性ElementName 属性值指定该名称)的另一个元素来指定数据源。该元素必须存在于同一个 XAML 名称范围中。

RelativeSource

通过描述绑定源相对于绑定目标位置的位置来指定数据源。这可以用运行时对象图来标识,并可以是 Self 或 TemplatedParent。无论是以属性格式设置还是作为标记扩展中的绑定属性,在 XAML 中设置 RelativeSource 属性都要求使用 RelativeSource 标记扩展

UpdateSourceTrigger

将绑定源更新的时间指定为以下字符串之一:Default 或 Explicit。如果未指定,则默认值为 Default

StringFormat

指定要用于显示的 String 格式。有关更多信息,请参见格式化类型

FallbackValue

指定无法解析源路径时所显示的值。

TargetNullValue

指定当源值为 null 时要显示的值。

练手的demo在下面

============================================================

    _悲剧的是在我复习 Converter 的时候 ,出现一行代码死机的事情。。我找出原因,差不多半个小时。。。

整个晚上的心情被彻底崩溃了。剩下那些好玩的属性也就没玩了。哎。。。用的时候再说。

下面还原崩溃现场。

 

<UserControl
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"
mc:Ignorable
="d"

d:DesignHeight
="300" d:DesignWidth="400"
xmlns:toolkit
="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
x:Class
="fpe.MainPage"
xmlns:my
="clr-namespace:fpe"
>
<UserControl.Resources>
 
<my:MainPage x:Key="convertTest"/>

</UserControl.Resources>

</UserControl>

 


 <my:MainPage x:Key="convertTest"/> 

 

 当这段复制写进 VS 的时候 立马崩溃。

以前听人说 一行代码崩溃VS的时候,觉得不可思议。。。现在我只感觉自己崩溃。。。

不知道是否是个人原因,所以在此

申明:如果你机器上测试没有这个问题别骂我无聊。

如果你找到了原因欢迎告知。。

令人崩溃的源代码

https://files.cnblogs.com/facingwaller/fpe2.rar