2014-02-21 76 views
0

我有我創建的繼承FrameworkElement類的WPF控件。其中之一是這樣做的:何時在ContentControl和ItemsControl中使用DataTemplate?

[ContentProperty("Children")] 
public class ItemsElement : FrameworkElement 
{ 
    public ItemsElement() 
    { 
     Children = new UIElementCollection(this, this); 
    } 

    public UIElementCollection Children { get; private set; } 

    protected override int VisualChildrenCount 
    { 
     get 
     { 
      if (Children != null) 
      { 
       return Children.Count; 
      } 

      return 0; 
     } 
    } 

    protected override Visual GetVisualChild(int index) 
    { 
     return Children[index]; 
    } 

    protected override IEnumerator LogicalChildren 
    { 
     get 
     { 
      if (Children != null) 
      { 
       return Children.GetEnumerator(); 
      } 

      return EmptyEnumerator.Instance; 
     } 
    } 

    protected override Size MeasureOverride(Size availableSize) 
    { 
     return availableSize; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     return finalSize; 
    } 
} 

我想要的代碼是有不是2D-UI元素的元素。我重寫了Measure和Arrange方法,以便它不計算孩子的大小。這是我想要的行爲,因爲這些計算是沉重且無用的。

問題是如果我把ContentControls和ItemsControls放入我的ItemsElement類的子項中(通過XAML),這些控件似乎並沒有使用我在資源中爲它們定義的DataTemplate從Content/ItemsSource生成它們的Visual子項。

,如果我在的MeasureOverride方法的開頭添加以下代碼,它工作:

foreach (UIElement child in Children) 
{ 
    child.Measure(availableSize); 
} 

我不明白爲什麼...

你有什麼想法?

謝謝!

回答

0

問題的確是你爲什麼要擴展一個你不想要的行爲?這裏的答案太長,但您可以在MSDN上的Control Authoring Overview頁面上完整閱讀。但總而言之,我只能假設你正在延誤錯誤的階級。也許你甚至不需要擴展任何課程。

在WPF中,有很多替代寫入新控件。通常唯一真正需要做的就是爲獨特的控制執行一些特殊的自定義繪圖,而這種控制不能用其他方式組成。正如鏈接頁面所述,WPF使您能夠通過使用其豐富的內容模型,樣式,模板和觸發器來定製現有控件。進一步繼續:

從UserControl或Control派生的控件依賴於組合現有元素。對於許多場景,這是一個可接受的解決方案,因爲從FrameworkElement繼承的任何對象都可以位於ControlTemplate中。但是,有時候控件的外觀需要的不僅僅是簡單元素組合的功能。對於這些場景,基於FrameworkElement的組件是正確的選擇。

最後,需要MeasureOverrideArrangeOverride方法進行,以使FrameworkElement呈現其項正確實施。你只需要看看MSDN就可以找到這些基本信息。從FrameworkElement.MeasureOverride Method頁:

你的實現應該做到以下幾點:
1.Iterate是每個子元素的佈局的一部分,通話測量兒童的元素的特定集合。

而且從FrameworkElement.ArrangeOverride Method頁:

父元素應該叫排列在每個孩子,否則孩子元素不會被渲染。

請閱讀更多的信息,並在今後的鏈接頁面,請看在MSDN的信息關於您的問題控制,方法,事件等在這裏問問題。


UPDATE >>>

在回答您的有些進攻評論,我可以看到你有正當理由,延長FrameworkElement類,但是這不會改變任何東西。您您已閱讀我向您展示的所有網頁,但出於某種原因,您沒有沒有跟着您的要做什麼的明確說明來正確呈現項目。

沒有必要回答關於DataTemplate的問題,以及它何時完全呈現,因爲它與您的問題無關。您的問題僅僅是因爲您沒有按照您的課堂上MSDN上的說明進行操作。而已。有一件事,你可以檢查,看看這是否正確的是這樣的。

如果您在運行應用程序時看到集合中的對象類型的全名,那麼您的DataTemplate未遇到問題。但是,如果您看不到任何項目,那麼您的渲染出現問題,這僅僅是因爲您沒有正確實施這兩種基本方法。

+0

請參閱[本文的這篇文章](http://stackoverflow.com/questions/21894063/how-to-use-datatemplate-with-frameworkcontentelement)知道爲什麼我擴展FrameworkElement而不是其他任何東西。你告訴我閱讀MSDN文檔,我已經做了,看到你'解釋'了,但是你沒有回答我的問題:什麼時候在ContentControl和ItemsControl中使用DataTemplate?也就是說在Measure方法的實現中,這對我來說是一個黑匣子。如果沒有幫助,不要說任何話。 – Hemel

+0

請注意您的意見。當任何用戶花時間回答問題時,採取這種態度是不恰當的。如果你再次看到你的問題,你會發現你真的*問過這個'MeasureOverride'方法:*我不明白爲什麼......你有什麼想法?*這就是我正在回答的,所以也許你需要編輯你的問題來更清楚你實際想知道的內容,而不是侮辱這個網站的高級會員。 – Sheridan

+0

是的,對不起。我對你的回答有點生氣。「閱讀文檔,小小的小白。」但我意識到原來的問題寫得不好......所以,再次抱歉! – Hemel

相關問題