日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

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

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

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

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

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

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

 然后在主窗體中放上這個新創(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.     

 看起來很平常的代碼,但是很遺憾,編譯無法通過。Visual Studio會告訴我們這樣的信息:

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

或許是翻譯的問題,這段錯誤提示可以說是文不對題,因為我們可以肯定的說:這個程序里面再沒有別的地方用到xamlBtn或者xamlText這樣的名稱。

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

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

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

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

 完全沒有問題!csText通過代碼也是可以訪問的,Click處理方法可以證明這一點:

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

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

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

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

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

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

3. 使用RegisterName手工管理命名空間。此方法我沒有實驗,并且它僅對WPF有效,Silverlight是沒有這個方法的。

上述方法2是我們最初曾經(jīng)使用的方法,但是目前已經(jīng)放棄了,因為手工綁定需要程序員自己編寫大量無聊的代碼,并且非常容易出錯。方法1是目前采用的方法,為此我們刪除了許多原先已經(jīng)寫好的XAML,全部改用C#代碼手工創(chuàng)建,其實這個工作并不算困難,因為大多數(shù)時候XAML到C#的映射還是比較直觀的,但由于Silverlight的自身設(shè)計的限制,存在一個明顯的限制:

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

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

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


網(wǎng)頁名稱:解決XAML自定義控件無法通過名稱訪問的問題
網(wǎng)頁鏈接:http://m.5511xx.com/article/copcedj.html