2010-03-10 44 views
15

我正在使用項目控件的ItemsPanel設置爲畫布(請參閱this問題獲取更多背景信息)。 ItemsControl的正在執行,因爲我想,並把它變成ItemsControl.Items手動添加一個子元素時,它就像一個魅力:當使用ItemsControl ItemsControl.ItemsPanel設置爲畫布時,ContenPresenter進入並破壞我的畫布屬性的子項[WPF]

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas IsItemsHost="True" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.Items> 
     <Button Canvas.Left="500" Content="Button Text" /> 
    </ItemsControl.Items> 
</ItemsControl> 

注意在按鈕上的Canvas.Left屬性。這就像一個魅力,而按鈕放置在ItemsControl左側500像素左右。大!

然而,當我定義的ItemsSource綁定到一個列表中,Canvas.left沒有任何效果:

<ItemsControl ItemsSource="{Binding Elements}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas IsItemsHost="True" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Canvas.Left="500" Content="Button Text" /> 
     </DataTemplate>  
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

通過在運行時檢測應用程序,我看到一個區別。容器ContentPresenter已添加到畫布和按鈕之間..

如何在ContentPresenter本身上設置Canvas.Left屬性?還是有另一種方法來解決這個問題?

謝謝大家!

回答

3

有幾種解決方案來我的腦海:

  1. 使用佈局/的RenderTransform,而不是附加屬性
  2. 使用保證金,而不是附加屬性
  3. 自ItemsControl派生,並重寫的行爲如何生成子容器。 (GetContainerForItemOverride,IsItemItsOwnContainerOverride)。本文解釋相當不錯它是如何工作:http://drwpf.com/blog/2008/07/20/itemscontrol-g-is-for-generator/
25

有可能利用設置Canvas.Left屬性ItemContainerStyle:

<ItemsControl ItemsSource="{Binding Elements}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas IsItemsHost="True" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Button Content="Button Text" /> 
      </DataTemplate>  
     </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Canvas.Left" Value="500" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 
+0

似乎很奇怪,但這對我很有用。 – bryanbcook 2011-03-31 04:41:38

+1

您也可以綁定ItemContainerStyle中的值,並且它將使用與DataTemplate用作源的相同項目。 :-) – 2013-06-20 13:53:39

+0

今天你是我的英雄。 謝謝。 – 2014-08-26 02:29:49

2

按鈕沒有一個「畫布」屬性,還等什麼你正在做的是做一個相對調用的託管控制,但是因爲項目和畫布在不同的模板中沒有直接的鏈接,因此Canvas.Left在運行前是沒有意義的。

因此,您的方法無法找到左側設置,因此失去了更改。

然而塞特斯僅在運行時實現,從而

<Setter Property="Canvas.Left" Value="500" /> 

已經生成後的對象,並因此確實有一個相對關係時才執行動作。

否則,您可以使用屬於按鈕對象的邊距,但只能在運行時解釋。