2010-02-25 50 views
3

我有一些Xaml對象的字符串表示形式,並且我想構建控件。我正在使用XamlReader.Parse函數來執行此操作。對於一個簡單的控制,如已經默認構造函數不採取任何參數按鈕能正常工作:將XamlReader用於沒有默認構造函數的控件

var buttonStr = "<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">Text</Button>"; 
var button = (Button)XamlReader.Parse(buttonStr); 

然而,當我嘗試這樣做是爲了例如行程控制失敗。首先嚐試一個簡單的空行程:

var strokeStr = "<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></Stroke>"; 
var stroke = (Stroke)XamlReader.Parse(strokeStr); 

這給了錯誤:

Cannot create object of type 'System.Windows.Ink.Stroke'. CreateInstance failed, which can be caused by not having a public default constructor for 'System.Windows.Ink.Stroke'.

中風的定義,我看到它至少需要一個StylusPointsCollection待建。我認爲這是錯誤告訴我的,雖然有點假設這將由XamlReader處理。試圖用StylusPoints改造中風的XAML中它給出了同樣的錯誤:

var strokeStr = 
    "<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + 
     "<Stroke.StylusPoints>" + 
      "<StylusPoint X=\"100\" Y=\"100\" />" + 
      "<StylusPoint X=\"200\" Y=\"200\" />" + 
     "</Stroke.StylusPoints>" + 
    "</Stroke>"; 
var stroke = (Stroke) XamlReader.Parse(strokeStr); 

我在做什麼錯?如何告訴XamlReader如何正確創建筆畫?

回答

3

這是XAML語言的「特徵」,它是聲明性的,並且不知道任何有關構造函數的內容。

人們在XAML中使用ObjectDataProvider來「翻譯」幷包裝沒有無參數構造函數的類(它的實例爲also useful for data binding)。

在你的情況下,XAML應該看起來大約是這樣的:

<ObjectDataProvider ObjectType="Stroke"> 
    <ObjectDataProvider.ConstructorParameters> 
     <StylusPointsCollection> 
      <StylusPoint X="100" Y="100"/> 
      <StylusPoint X="200" Y="200"/> 
     </StylusPointsCollection> 
    </ObjectDataProvider.ConstructorParameters> 
</ObjectDataProvider> 

和代碼應該是:

var stroke = (Stroke) ((ObjectDataProvider)XamlReader.Parse(xamlStr)).Data; 

HTH。

+0

Thx!沒有意識到ObjectDataProvider .. – stiank81 2010-02-26 11:39:28

+0

這不是真的。 XAML 2006不知道構造函數,但XAML 2009當然會。 – 2011-07-20 20:15:34

相關問題