天天看點

Silverlight之XAML學習和一行崩潰VS的代碼

想知道如何一行代碼崩潰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 UserControls、ContentControls 和 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 将綁定模式指定為以下字元串之一:OneTime、OneWay 或 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