Silverlight中的画布绑定

8
我正在尝试创建一个画布,其中的项目位于画布上指定的位置。由于无法直接将源和模板绑定到Canvas,因此我使用了ItemsControl。但是,存在一个问题,即所有项目都位于0,0处。我已经测试了绑定,它们不会返回0,0。如何使这个工作,以便项目位于正确的位置?
此外,是否可以在画布上创建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>

我已经放弃了这个项目,但我会保留这个问题,如果有答案的话。


我添加了一份悬赏,因为我的错误答案基本上让你提出的问题无解了,对此我感到抱歉。希望这样能够引起它应有的关注。 - H.B.
你能发一下你尝试绑定的类的代码吗? - viggity
1个回答

7

由于它依赖于Setter.Value中的绑定,因此以下所有内容在SL4中均无效。


尝试在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>

这个 <ItemsControl.ItemContainerStyle> 应该插入到哪里?我一直收到错误提示:“在类型 'ItemsControl' 中找不到可附加的属性 'ItemContainerStyle'”。 - Androme
它不是一个附加属性,你可以将它作为ItemsControl的子元素放置,就像使用<ItemsControl.ItemTemplate>一样。也就是说,它不应该放在ItemTemplate内部。 - H.B.
请看我是否已将其插入到第一篇帖子中,这会给我一个错误:“Error 1 The property 'ItemContainerStyle' does not exist on the type 'ItemsControl' in the XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'。” - Androme
哦,我已经在WPF中测试过了,它可以工作,可能这个属性在Silverlight中根本不存在吗?我添加了另一种方法来完成它,而不使用那个属性。 - H.B.
当我插入<ItemsControl.Resources>时,它现在给了我一个错误“无法设置只读属性''”。看起来问题不在于资源本身,而是两个<Setter Property>引起的问题。 - Androme
唉,我放弃了...如果两种方法都不起作用,我真的不知道该怎么办了。 - H.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接