2011-01-22 62 views
8

我想創建一個畫布,物品位於canvast上的指定位置,因爲我無法將源和模板直接綁定到畫布,我是否使用了ItemsControl。 但有一個問題,所有的項目都位於0,0。我已經測試了綁定,他們不返回0,0。 我如何使這項工作,使項目位於正確的地方?Canvas綁定在Silverlight中

也是在畫布上創建2層,其中每個圖層綁定到一個不同的來源,並使用不同的模板?

這是在Silverlight

<ItemsControl Grid.Row="1" Grid.Column="1" 
       Width="650" Height="650" 
       ItemsSource="{Binding Skills}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas Margin="0" 
       Width="650" Height="650" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Canvas.Top="{Binding Top}" Canvas.Left="{Binding Left}"> 
        <TextBlock Text="{Binding Name}" /> 
       <Image Source="{Binding Icon}" /> 
       <StackPanel Orientation="Horizontal" > 
        <TextBlock FontWeight="Bold" TextAlignment="Center" Text="{Binding SkillPointsStatusText}" /> 
       </StackPanel> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

測試與ItemContainerStyle

<ItemsControl Grid.Row="1" Grid.Column="1" 
       Width="650" Height="650" 
       ItemsSource="{Binding Skills}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas Margin="0" 
       Width="650" Height="650" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}" /> 
       <Image Source="{Binding Icon}" /> 
       <TextBlock FontWeight="Bold" TextAlignment="Center" Text="{Binding SkillPointsStatusText}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Canvas.Top" Value="{Binding Top}" /> 
      <Setter Property="Canvas.Left" Value="{Binding Left}" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

嗯,我DROP掉這個項目,但我會離開的問題開放應該有一個anwser

+0

我加了獎金,因爲我幾乎被殺當你用我的非工作答案提問時,這個問題很抱歉。希望這會給它應有的關注。 –

+0

您可以發佈您嘗試綁定的類的代碼嗎? – viggity

回答

7

所有以下在SL4中不起作用,因爲它取決於Setter.Value中的綁定。


嘗試設置在ItemContainerStyle因爲你StackPanel結合不是根元素;您的模板將被放置在ContentPresenter中,因此您在StackPanel中的畫布定位附加屬性將被忽略。

<ItemsControl.ItemContainerStyle> 
    <Style> 
     <Setter Property="Canvas.Top" Value="{Binding Top}" /> 
     <Setter Property="Canvas.Left" Value="{Binding Left}" /> 
    </Style> 
</ItemsControl.ItemContainerStyle> 

編輯:如果Silverlight不支持ItemContainerStyle可以設置ContentPresenters通用風格,應該工作一樣好:

<ItemsControl ItemsSource="{Binding Data}"> 
     <ItemsControl.Resources> 
      <Style TargetType="ContentPresenter"> 
       <Setter Property="Canvas.Left" Value="{Binding Left}"/> 
       <Setter Property="Canvas.Top" Value="{Binding Top}"/> 
      </Style> 
     </ItemsControl.Resources> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       ... 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
+0

這個在哪裏被插入?我不斷收到錯誤「在'ItemsControl'類型中未找到可附加屬性'ItemContainerStyle'」。 – Androme

+0

它不是一個附加屬性,您將它作爲ItemsControl的子項放置,就像您使用一樣。即它不**屬於ItemTemplate內部。 –

+0

請參見我已經在第一篇文章中插入它,這給了我錯誤,錯誤屬性'ItemContainerStyle'不存在於XML命名空間'http://schemas.microsoft.com'類型'ItemsControl'中/ WinFX的/ 2006/XAML /演示」。 – Androme