【问题标题】:Image with Overlay ItemsControl带有 Overlay ItemsControl 的图像
【发布时间】:2017-01-04 10:53:36
【问题描述】:

我找到了一个示例,如果我删除了ScrollViewer,它运行良好,但我需要ScrollViewer 中的图像。 TextBox 应该是图像的叠加层。

在此示例中,图像不在ScrollViewer 内。有人可以告诉我如何在里面添加图像吗?

<Image Grid.Column="2" HorizontalAlignment="Center" Source="/Images/Italien.png"
       Stretch="None"/>
    <ScrollViewer Grid.Column="2" Margin="2,2,2,2" HorizontalScrollBarVisibility="Visible"
                  VerticalScrollBarVisibility="Visible">
        <ItemsControl ItemsSource="{Binding Tests}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Setter Property="Canvas.Left" Value="{Binding X}"/>
                    <Setter Property="Canvas.Top" Value="{Binding Y}"/>
                </Style>
            </ItemsControl.ItemContainerStyle>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="123" Foreground="Aqua" Background="Transparent"
                             FontSize="10" TextAlignment="Justify" BorderBrush="Red"
                             BorderThickness="1" Width="{Binding Width}"
                             Height="{Binding Height}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
</Image>

【问题讨论】:

    标签: c# .net wpf xaml mvvm


    【解决方案1】:

    我不确定我是否了解您的要求,但您可以将 Image 和 ItemsControl 添加到面板(例如 Grid)中,然后将面板添加到 ScrollViewer:

    <ScrollViewer Grid.Column="2" Margin="2,2,2,2" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
        <Grid>
            <Image Grid.Column="2" HorizontalAlignment="Center" Source="/Images/Italien.png" Stretch="None"/>
            <ItemsControl ItemsSource="{Binding Tests}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas IsItemsHost="True"/>
    
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemContainerStyle>
                    <Style>
                        <Setter Property="Canvas.Left" Value="{Binding X}"/>
                        <Setter Property="Canvas.Top" Value="{Binding Y}"/>
                    </Style>
                </ItemsControl.ItemContainerStyle>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
    
                        <TextBox Text="123" Foreground="Aqua" Background="Transparent" FontSize="10" TextAlignment="Justify" BorderBrush="Red" BorderThickness="1" Width="{Binding Width}" Height="{Binding Height}"/>
    
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    </ScrollViewer>
    

    一个 ScrollViewer 只能有一个 Child 元素,因此为了能够同时添加 Image 和其他一些元素,您需要将它们都添加到 Panel 中。

    编辑:如果您想将图像设置为 Canvas ItemsPanel 的背景,您可以将 Canvas 的 Background 属性设置为 ImageBrush:

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas IsItemsHost="True">
                <Canvas.Background>
                    <ImageBrush ImageSource="/Images/Italien.png" />
                </Canvas.Background>
            </Canvas>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    

    【讨论】:

    • 我忘了放置网格,但我还有一个问题。文本框(覆盖)与图像有偏移。我可以将文本框作为子图像分配给图像以防止偏移吗?
    • 不,图像没有 Child 属性,但您可以使用其 Margin 属性和/或 Horizo​​ntalAlignment/VerticalAlignment 属性调整 TextBox 的位置。带有 TextBox(es) 的 ItemsControl 将最终位于 Image 之上,因为它们位于同一个 Grid 中。这不是你想要的吗?
    • 我根据图像像素获取叠加层的位置,我想保存重新计算所有值的工作,以使叠加层的正确位置匹配。有没有更简单的方法?
    • 那么你基本上是想把Image设置为Canvas面板的背景呢?然后,您可以将 ItemsPanel 中 Canvas 的 Background 属性设置为 ImageBrush。我编辑了我的答案。
    • 谢谢,工作。我将画布的高度和宽度固定为图像大小,因为不需要图像拉伸。不幸的是,滚动查看器无法正常工作,但对于第一个演示应用程序来说还可以。我找到了满足我要求的示例 codeproject.com/Articles/20457/Annotating-an-Image-in-WPF 但这需要一些时间才能更改为 mvvm 模式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多