日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
解決XAML自定義控件無(wú)法通過(guò)名稱訪問(wèn)的問(wèn)題

為了解決WPF/Silverlight陷阱:XAML自定義控件的嵌套內(nèi)容無(wú)法通過(guò)名稱訪問(wèn)的問(wèn)題,我們首先要了解XAML自定義控件的實(shí)現(xiàn)原理,然后是控件的創(chuàng)建過(guò)程。希望那個(gè)本文能對(duì)大家有所幫助。

我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、坊子ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的坊子網(wǎng)站制作公司

為了說(shuō)明這個(gè)問(wèn)題,假定我們需要實(shí)現(xiàn)一個(gè)具有特殊功能的按鈕控件。編寫Xaml文件如下:

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

對(duì) Code Behind類,唯一的改動(dòng)是把向?qū)傻幕悘腢serControl改成Button:

 
 
 
  1. public partial class XamlButton : Button
  2. {
  3.     public XamlButton()
  4.     {
  5.         InitializeComponent();
  6.     }
  7. }

 然后在主窗體中放上這個(gè)新創(chuàng)建的控件:

 
 
 
  1.  x:Class="TestWpf.Window1"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.     xmlns:local="clr-namespace:TestWpf"
  5.     Title="Window1" Height="300" Width="300">
  6.     
  7.          x:Name="xamlBtn" Click="xamlBtn_Click">
  8.              x:Name="xamlText" Text="Xaml Button" />
  9.         
  10.     

 看起來(lái)很平常的代碼,但是很遺憾,編譯無(wú)法通過(guò)。Visual Studio會(huì)告訴我們這樣的信息:

無(wú)法在元素“TextBlock”上設(shè)置 Name 屬性值“xamlText”?!癟extBlock”位于元素“XamlButton”的范圍之內(nèi),該元素已經(jīng)具有在其他范圍中定義時(shí)注冊(cè)的名稱。

或許是翻譯的問(wèn)題,這段錯(cuò)誤提示可以說(shuō)是文不對(duì)題,因?yàn)槲覀兛梢钥隙ǖ恼f(shuō):這個(gè)程序里面再?zèng)]有別的地方用到xamlBtn或者xamlText這樣的名稱。

如果我們換個(gè)方式,不再用XAML聲明控件,而是用C#代碼定義:

 
 
 
  1. public class CsButton : Button
  2. {
  3. }

然后再試試用同樣的方式把這個(gè)控件加到主界面上:

 
 
 
  1.  x:Name="csBtn" Click="csBtn_Click">
  2.      x:Name="csText" Text="Cs Button" />

 完全沒有問(wèn)題!csText通過(guò)代碼也是可以訪問(wèn)的,Click處理方法可以證明這一點(diǎn):

 
 
 
  1. private void csBtn_Click(object sender, RoutedEventArgs e)
  2. {
  3.     MessageBox.Show(csText.Text);
  4. }

如果用Silverlight來(lái)實(shí)驗(yàn)同樣的代碼,結(jié)果會(huì)稍有不同。在Silverlight XAML中添加x:Name并不會(huì)報(bào)錯(cuò) ,但是運(yùn)行時(shí)就會(huì)出現(xiàn)問(wèn)題——xamlText總是等于null,并且FindName("xamlText")同樣返回null,因此文本內(nèi)容用自動(dòng)生成的代碼是無(wú)法訪問(wèn)的。但是以Button作為根對(duì)象來(lái)查找文本框,卻能夠找到:

 
 
 
  1. xamlText = (TextBlock)xamlBtn.Content;
  2. HtmlPage.Window.Alert(xamlText.Text);

此實(shí)驗(yàn)可以說(shuō)明:用XAML來(lái)聲明自定義控件是存在嚴(yán)重問(wèn)題的,控件內(nèi)容中的對(duì)象無(wú)論是通過(guò)自動(dòng)生成的成員變量還是用根容器的FindName都無(wú)法訪問(wèn)。要繞開這個(gè)限制,有以下幾種可能的途徑:

1. 使用C#手工構(gòu)造自定義控件,不用XAML聲明;

2. 使用自定義控件的FindName找到內(nèi)容對(duì)象,然后手工綁定到成員變量;

3. 使用RegisterName手工管理命名空間。此方法我沒有實(shí)驗(yàn),并且它僅對(duì)WPF有效,Silverlight是沒有這個(gè)方法的。

上述方法2是我們最初曾經(jīng)使用的方法,但是目前已經(jīng)放棄了,因?yàn)槭止そ壎ㄐ枰绦騿T自己編寫大量無(wú)聊的代碼,并且非常容易出錯(cuò)。方法1是目前采用的方法,為此我們刪除了許多原先已經(jīng)寫好的XAML,全部改用C#代碼手工創(chuàng)建,其實(shí)這個(gè)工作并不算困難,因?yàn)榇蠖鄶?shù)時(shí)候XAML到C#的映射還是比較直觀的,但由于Silverlight的自身設(shè)計(jì)的限制,存在一個(gè)明顯的限制:

不像WPF,Silverlight里面沒有簡(jiǎn)單的辦法可以從代碼創(chuàng)建一個(gè)Template。在WPF中,可以指定Template.VisualTree,但是Silverlight沒有提供這個(gè)屬性,所以要從代碼里是生成Template是很困難的。網(wǎng)上曾有人提供過(guò)一個(gè)思路,即用字符串拼出模板的XAML字符串,再用XamlReader.Load讀出模板對(duì)象。這個(gè)方法雖然可行,但比較丑陋,拼字符串總是下下策,維護(hù)也很困難。我們現(xiàn)在使用的是一個(gè)折中的辦法,Template還是用XAML來(lái)保存,但是需要編寫一些自定義代碼,以便把C#控件和XAML中的模板關(guān)聯(lián)起來(lái)。不幸的是,這個(gè)辦法導(dǎo)致本來(lái)是同一個(gè)控件的內(nèi)容不得不在兩個(gè)地方分別維護(hù),還要時(shí)時(shí)注意兩邊的代碼保持同步,因此也不能說(shuō)是一個(gè)完滿的解決辦法。

后記: 我現(xiàn)在主要的工作,是基于Silverlight開發(fā)一個(gè)應(yīng)用程序平臺(tái),在此過(guò)程中已經(jīng)感覺到Silverlight的一些不足,包括實(shí)現(xiàn)上不夠完整(比如說(shuō)缺少Decorator,沒有OnRender),部分API在版本之間的大幅度變動(dòng)(針對(duì)Silverlight 3 Beta的一些例子現(xiàn)在都已經(jīng)失效了),也有設(shè)計(jì)上的復(fù)雜性導(dǎo)致的一些微妙的問(wèn)題,本文所提到的就是這些問(wèn)題的其中之一,給框架層面的實(shí)現(xiàn)帶來(lái)了不少麻煩。此外值得一提的是,我們現(xiàn)在編譯的xap包大小已經(jīng)長(zhǎng)到了800k以上,可以說(shuō)和Adobe Flex編譯出來(lái)的文件大小不相上下。對(duì)于文件大小“貢獻(xiàn)”最多的是System.Windows.Controls、System.Windows.Controls.Data、System.Windows.Controls.Toolkit和System.Xml.Serialization這四個(gè)程序集,其中除了***一個(gè)或許可以考慮以后不再用XML序列化,前面3個(gè)是不可能不使用的。所以Flex文件編譯以后6、7百K的體積真的算不上大,Silverlight同樣是這個(gè)水平,那些總是叫喚文件太大的同學(xué)也應(yīng)該了解,RIA程序的尺寸基本上也就這樣了,除了用RSL之類技術(shù)切割一下以外,已經(jīng)沒有多大優(yōu)化的余地了。如果這個(gè)大小您也不能接受的話,那還是用回Ajax吧。

鏈接:http://www.cnblogs.com/shuhari/archive/2009/10/29/wpf_silverlight_custom_control_issue.html


網(wǎng)站欄目:解決XAML自定義控件無(wú)法通過(guò)名稱訪問(wèn)的問(wèn)題
本文路徑:http://www.dlmjj.cn/article/copcedj.html