wpf - 银光下的 Canvas 装订

标签 wpf silverlight xaml data-binding

我正在尝试创建一个 Canvas ,项目位于 Canvas 上指定的位置,因为我无法将源和模板直接绑定(bind)到 Canvas ,我是否使用了 ItemsControl。
但是有一个问题,所有项目都位于 0,0 处。我已经测试了它们不返回 0,0 的绑定(bind)。
我怎样才能完成这项工作,以便将元素放置在正确的位置?

是否可以在 Canvas 上创建 2 个图层,每个图层都绑定(bind)到不同的源并使用不同的模板?

这是在 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>

好吧,我已经放弃了这个项目,但是如果有人有答案,我会留下这个问题

最佳答案

以下所有内容在 SL4 中都不起作用,因为它依赖于 Setter.Value 中的绑定(bind)。 .

尝试在 ItemContainerStyle 中设置绑定(bind)因为你的StackPanel不是根元素;您的模板将被放置在 ContentPresenter ,因此您在 StackPanel 中的 Canvas 定位附加属性将被忽略。

<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>

关于wpf - 银光下的 Canvas 装订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771146/

相关文章:

c# - 为什么我的 C# 事件在没有运行应用程序的情况下在 XAML (WPF) 上触发?

c# - 我如何从框架中获取页面实例?

silverlight - 在加载 Windows Phone 7 应用程序时将焦点设置到文本框

c# - 如何防止 ListView 扩展窗口维度?

wpf - 为每个角的边框设置不同的画笔颜色

.net - Silverlight 4 WCF 或 RIA 服务

c# - Silverlight - 验证一个属性

c# - Xamarin Forms 向左滑动/向右滑动手势

c# - DevExpress 一个功能区用于多个 RichEditControls

wpf - 使用 XAML 图像作为 WPF 窗口背景