1

我正在使用 Kinect 开发基于手势的图像查看器。我正在使用以下 XAML 代码在画布上显示图像。

    <Canvas Background="Transparent" Height="732" VerticalAlignment="Top">
        <Image x:Name="next" Source="{Binding NextPicture}" StretchDirection="Both" Stretch="Uniform" ClipToBounds="True" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="HighQuality" RenderTransformOrigin="0.5,0.5" Opacity="0" Grid.ColumnSpan="2" Height="732" Width="Auto" HorizontalAlignment="Center" />
        <Image x:Name="previous" Source="{Binding PreviousPicture}" StretchDirection="Both" Stretch="Uniform" ClipToBounds="True" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="HighQuality" RenderTransformOrigin="0.5,0.5" Opacity="0" Grid.ColumnSpan="2" Height="732" Width="Auto" HorizontalAlignment="Center" />
        <Image x:Name="current" Source="{Binding Picture}" StretchDirection="Both" Stretch="Uniform" ClipToBounds="True" SnapsToDevicePixels="True" RenderOptions.BitmapScalingMode="HighQuality" RenderTransformOrigin="0.5,0.5" Grid.ColumnSpan="2" Height="732" Width="Auto" HorizontalAlignment="Center" />
    </Canvas>

这是在后面运行的代码:

    /// <summary>
    /// Gets the previous image displayed.
    /// </summary>
    public BitmapImage PreviousPicture { get; private set; }

    /// <summary>
    /// Gets the current image to be displayed.
    /// </summary>
    public BitmapImage Picture { get; private set; }

    /// <summary>
    /// Gets the next image displayed.
    /// </summary>
    public BitmapImage NextPicture { get; private set; }

每次识别手势时,属性都会更改,如下所示:

    // Setup corresponding picture if pictures are available.
                this.PreviousPicture = this.Picture;
                this.Picture = this.NextPicture;
                this.NextPicture = LoadPicture(Index + 1);

                // Notify world of change to Index and Picture.
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs("PreviousPicture"));
                    this.PropertyChanged(this, new PropertyChangedEventArgs("Picture"));
                    this.PropertyChanged(this, new PropertyChangedEventArgs("NextPicture"));
                }

然而问题是,我在画布上显示的图像随机向左或向右对齐。它们的纵横比有时也会发生变化。我想要的是,图像应该以其原始纵横比显示在画布的中心。有人可以在这方面帮助我吗?

此外,我可以使用 C# 代码将图像设置为中心,如下所示:

    Canvas.SetLeft(current, (1249 - current.ActualWidth) / 2);
    Canvas.SetTop(current, 0);

其中,“current”是 XAML 代码中当前图像的名称。但我希望它自动发生。XAML 代码中是否有可能?如果没有,我该如何实现?

PS:我不太擅长 C# 或 WPF。因此,如果可能,请用外行术语解释。

4

2 回答 2

4

您可以通过使用接受和的参数的IMultiValueConverterCanvas.Left绑定属性来在 XAML 中居中​​图像,然后返回,但是根据您上面的评论,听起来您允许用户通过设置使用手部动作重新定位图像图像,这将覆盖您与转换器的绑定。Canvas.WidthImage.Width(Canvas.Width / 2) - (Image.Width / 2)Canvas.Left

我实际上建议使用 aGrid而不是 a Canvas,并使用 定位您的图像HorizontalAlignment=Center,并允许用户使用 a 来调整图像的位置RenderTransform(请注意,您需要使用RenderTransform, not LayoutTransform,因此在渲染时应用转换,而不是在 WPF 是试图布局你的对象)。

如果这不起作用,我会将图片属性从 BitmapImages 更改为表示该图像的实际类,其属性为BitmapImageTopLeft。要在图像周围移动,您将更改Picture.Left属性,当用户切换图片时,您可以将Picture.Left属性重置为其原始值

于 2012-10-03T15:30:51.453 回答
0

我会用帆布。当应用程序开始确定屏幕中心时,请使用一点方法。将窗口大小除以 2,然后将其用作图像位置的起点。对于 kinect 控制,我肯定会使用画布。

于 2012-10-03T21:41:58.223 回答