Application=Code+Markup 讀書筆記 19
19章XAML
鬆散XAML:
<Buttonxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
Hello World!
Button>
.xaml副檔名被關聯到PresentationHost.exe程式。只要執行XAML,就會執行此程式,由其建立Page型別的物件,而此程式又可以嵌入IE中。PresentationHost.exe程式還將載入的XAML轉成實際的Button物件,並將物件設定為Page的Content屬性。
這裡,是XamlReader.Load這個靜態方法將XAML轉成物件。
需要在伺服器上為.xaml副檔名註冊MIME型別,在.hta檔案中加入下面這行:
AddType application/xaml+xml xaml
鬆散XAML的根元素可以是繼承FrameworkElement的任何類,但不可以是Window。
XamlWriter.Save方法,從物件產生XAML——與XamlReader.Load功能正好相反。
使用XamlReader.Load手動載入XAML的方法:
stringstrXaml =
@"
Foreground='LightSeaGreen' FontSize='24pt'>
Click me!
";
有兩種載入方法:
方法1,操作記憶體:
MemoryStreammemory =newMemoryStream(strXaml.Length);
StreamWriterwriter =newStreamWriter(memory);
writer.Write(strXaml);
writer.Flush();
memory.Seek(0,SeekOrigin.Begin);
Objectbj =XamlReader.Load(memory);
方法2,作為XML讀取:
StringReaderstrReader =newStringReader(strXaml);
XmlTextReaderxmlReader =newXmlTextReader(strReader);
Objectbj =XamlReader.Load(xmlReader);
將這個obj設定給Content,然後在Main中載入,完整程式碼如下:
publicclassLoadEmbeddedXaml:Window
{
[STAThread]
publicstaticvoidMain()
{
Applicationapp =newApplication();
app.Run(newLoadEmbeddedXaml());
}
publicLoadEmbeddedXaml()
{
stringstrXaml =
"
" Foreground='LightSeaGreen' FontSize='24pt'>"+
" Click me!"+
"";
StringReader strreader =newStringReader(strXaml);
XmlTextReader xmlreader =newXmlTextReader(strreader);
objectbj = XamlReader.Load(xmlreader);
Content = obj;
}
}
注意:載入XAML的內部過程:
PresentationHost.exe程式判斷出返回物件為Button,於是進行相應轉換
Buttonbtn = (Button)XamlReader.Load(xmlReader);
然後自動設定事件處理函式:
btn.Click += ButtonClick;
以上處理的是內嵌XAML——將其寫入字串中。下面是如何載入外部XAML:
這裡,即使是一個xml檔案,只要裡面的內容是XAML的,也可以解析。
對於外部的LoadXamlResource.xml檔案——位於與解決方案相同的目錄下,在類的建構函式中對其進行載入:
Uriuri =newUri("pack://application:,,,/LoadXamlResource.xml");
Streamstream =Application.GetResourceStream(uri).Stream;
FrameworkElementel =XamlReader.Load(stream)asFrameworkElement;
Content = el;
Buttonbtn = el.FindName("MyButton")asButton;
if(btn !=null)
btn.Click += ButtonOnClick;
然後在Main函式中,執行這個例項:
publicstaticvoidMain()
{
Applicationapp =newApplication();
app.Run(newLoadXamlResource());
}
如果XAML是一個Window根元素,此時載入要特殊處理——直接在Main函式中處理,將載入到的流轉型Window型別,並新增事件控制程式碼,然後直接執行:
publicstaticvoidMain()
{
Applicationapp =newApplication();
Uriuri =newUri("pack://application:,,,/LoadXamlWindow.xml");
Stream stream =Application.GetResourceStream(uri).Stream;
Windowwin = XamlReader.Load(stream)asWindow;
win.AddHandler(Button.ClickEvent,
newRoutedEventHandler(ButtonOnClick));
app.Run(win);
}
對於使用Open File的方式開啟磁碟上一個XAML:
XmlTextReaderxmlreader =newXmlTextReader(dlg.FileName);
// Convert XAML to object.
objectbj =XamlReader.Load(xmlreader);
// If it's a Window, call Show.
if(objisWindow)
{
Windowwin = objasWindow;
win.Owner =this;
win.Show();
}
// Otherwise, set as Content of Frame.
else
frame.Content = obj;
額外需要注意的是,對於一個Window物件的XAML,要把Owner設定為this自己。
xmln宣告預設的XML預設名稱空間。這個名稱空間會被應用於宣告出現的element以及其下的每個孩子。它的名稱必須是唯一且一致的,所以常使用URL作為名稱空間,也就是
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
XAML不只用於WPF,還可以用於WF等框架,所以這裡使用presentation作為URL的字尾。
XAML規範定義了多個元素和屬性,可以在任何XAML中使用,包括WPF。這些元素和屬性被關聯到不同於WPF的名稱空間。由於我們肯定要使用到這些元素,所以要宣告
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
這裡標誌為xmlns:x,從而XAML中的專用元素和屬性都以x為字首,例如x:Code和x:Class,它們都屬於XAML名稱空間,而非WPF名稱空間。
由於WPF名稱空間的元素和屬性多於XAML名稱空間,所以使用前者作為預設名稱空間。
x:Class屬性
只能出現在XAML檔案的根元素中?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15123181/viewspace-423015/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Application=Code+Markup 讀書筆記 1-4APP筆記
- Application=Code+Markup 讀書筆記 5-7APP筆記
- WPF=Code+Markup 筆記 8筆記
- WPF=Code+Markup 筆記 21筆記
- 讀書筆記...筆記
- 讀書筆記筆記
- 《讀書與做人》讀書筆記筆記
- Cucumber讀書筆記筆記
- 散文讀書筆記筆記
- HTTP 讀書筆記HTTP筆記
- CoreJava讀書筆記-------Java筆記
- flask讀書筆記Flask筆記
- Vue讀書筆記Vue筆記
- MONGODB 讀書筆記MongoDB筆記
- Qt讀書筆記QT筆記
- Node讀書筆記筆記
- SAP讀書筆記筆記
- YII讀書筆記筆記
- iptables 讀書筆記筆記
- Makefile 讀書筆記筆記
- mysql讀書筆記MySql筆記
- 鎖讀書筆記筆記
- dataguard讀書筆記筆記
- 讀書筆記3筆記
- 讀書筆記2筆記
- postgres 讀書筆記筆記
- 《重構》讀書筆記筆記
- webpackDemo讀書筆記Web筆記
- PMBook讀書筆記(一)筆記
- Effective Java 讀書筆記Java筆記
- js高程讀書筆記JS筆記
- “Docker Practice”讀書筆記Docker筆記
- FPGA讀書筆記5FPGA筆記
- FPGA讀書筆記3FPGA筆記
- FPGA讀書筆記4FPGA筆記
- FPGA讀書筆記2FPGA筆記
- FPGA讀書筆記1FPGA筆記
- 《精通JavaScript》讀書筆記JavaScript筆記