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

実際には のGrid代わりに を使用し、Canvasを使用して画像を配置しHorizontalAlignment=Center、ユーザーが を使用して画像の位置を調整できるようにすることをお勧めします (ではなくRenderTransformを使用する必要があることに注意してください。そのため、WPF の場合ではなく、レンダリング時に変換が適用されます。オブジェクトをレイアウトしようとしています)。RenderTransformLayoutTransform

それがうまくいかない場合は、Picture プロパティを BitmapImages からその画像を表す実際のクラスに変更しBitmapImage、 、Top、およびLeft. 画像を移動するには、Picture.Leftプロパティを変更します。ユーザーが画像を切り替えたときに、Picture.Leftプロパティを元の値にリセットできます。

于 2012-10-03T15:30:51.453 に答える
0

キャンバスを使用します。アプリが画面の中心を決定するときに、ちょっとした方法を使用します。ウィンドウのサイズを 2 で割った値を取得し、それをイメージの位置の開始点として使用します。kinect の制御には、間違いなく canvas を使用します。

于 2012-10-03T21:41:58.223 に答える