【问题标题】:ItemsControl inside existing Canvas现有 Canvas 中的 ItemsControl
【发布时间】:2011-11-14 14:08:42
【问题描述】:

我正在努力完成以下工作。

1) 在我的页面上有一个画布控件,具有可缩放和可平移的背景图像。这适用于我所拥有的。 2) 在画布内显示一组控件。这被设想为类似于 Bing 主页在此处显示的图像上显示热点的方式。当图像被平移/缩放时,控件需要在画布上移动。

我尝试了以下方法

    <Canvas Name="PanoCanvas" >
        <Canvas.Background>
            <ImageBrush x:Name="PanoImage" ImageSource="/Images/OtherImages/PanoBackound.jpg" Stretch="None" />
        </Canvas.Background>
        <ItemsControl Name="POIPresenter">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <uc:PointOfInterest />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemContainerStyle>
                <Style TargetType="ContentPresenter">
                    <Setter Property="Canvas.Top" Value="{Binding TopPosition}" />
                    <Setter Property="Canvas.Left" Value="{Binding LeftPosition}" />
                </Style>
            </ItemsControl.ItemContainerStyle>
        </ItemsControl>
    </Canvas>

并在后面的代码中设置 POIPresenter 的 ItemsSource,但用户控件在左侧(在 0,0 处)彼此重叠显示。

我尝试在 ItemsPanelTemplate 中移动画布声明,但我设置图像比例/中心的声明不起作用 - 他们找不到 PanoCanvas 控件。

谁能指出我在这里做的令人痛苦的显而易见的事情吗?

提前致谢。

【问题讨论】:

    标签: c# xaml itemscontrol windows-8


    【解决方案1】:

    对于初学者,您可以简化如下:

    <ItemsControl ...>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas>
                    <Canvas.Background>...</Canvas.Background>
                </Canvas>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
    

    也就是说,使用一个Canvas 而不是两个。

    除此之外,在输出窗口中查找绑定错误。也许TopPositionLeftPosition 属性没有被正确解析。

    【讨论】:

    • 这就是我尝试过的(简化 ItemsPanelTemplate 中的画布),但后来我无法从后面的代码中引用它。我再试一次 - 也许我做错了......
    • 好的,忘记这一点 - 你不能轻易引用它,因为它是由ItemsPanelTemplate 生成的。您必须使用 VisualTreeHelper 之类的东西才能获得它。你的主要问题是什么?是绑定问题吗?
    • 我在输出窗口中看不到任何内容,并且其他属性在控件本身中按预期绑定。
    • 我刚刚添加了另一个文本块来输出项目模板中的 TopPosition 和 LeftPosition,它们在那里绑定得很好,尽管它们被强制转换为字符串进行显示。他们是模型中的双打。
    • 尝试将ItemsControl 更改为ListBox 并将ContentPresenter 样式更改为ListBoxItem 样式,只是为了测试。如果可行,我认为您需要使用 ItemsControl 将其项目托管在 ContentControl 实例中,而不是 ContentPresenters
    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多