1

私はWPFGinectプロジェクトに取り組んでいます。これは、Windows Kinectの開発者ツールキットサンプルの1つであり、「Kinectエクスプローラー」と呼ばれます。Kinect Developer Toolkit SDKver1.5からダウンロードできます。kinectwindow.xamlに、ボタンとチェックボックスを追加しました。また、kinectskeleton.csというクラスがあり、2つのDataTableとブール変数を作成しました。最初DataTableのものはOnRender関数に入力され、もう1つは空です。ブール変数はデフォルトでfalseに設定されています。だから、私が欲しいのは、kinectwindow.xaml.csのボタンが押されたときに、塗りつぶされた最新のデータがDataTable空のデータにコピーされることです。次に、チェックボックスをオンにすると、ブール値がtrueに設定されます。だから、これを行う方法は?

kinectskeleton.csクラスで、データを塗りつぶしから空にコピーする関数を定義しましたDataTable。kinectwindow.xaml.csのボタンのOnClick関数で、クラスからオブジェクトを作成してkinectskeletonこの関数を呼び出しましたが、両方のDataTableが空です。関数のチェックボックスについても同じですCheckBox_Checked。クラスのブール値kinectskeltonをtrueに設定しました(チェックされていない関数ではfalseに設定しました)。しかし、その結果、kinectskeltonクラスでは常にデフォルト値(false)に設定され、trueのときに入力するように作成したif条件には決して入りません。

それがより明確になり、提案を待っていることを願っています。ツールキットをダウンロードするには、次のリンクを参照してください:http: //www.microsoft.com/en-us/kinectforwindows/develop/developer-downloads.aspx

私のコードの一部:

//------------------------------------------------------------------------------
// <copyright file="KinectWindow.xaml.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------

namespace Microsoft.Samples.Kinect.KinectExplorer
{
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Input;
    using Microsoft.Kinect;
    using Microsoft.Samples.Kinect.WpfViewers;

    /// <summary>
    /// Interaction logic for KinectWindow.xaml.
    /// </summary>
    public partial class KinectWindow : Window
    {
        public static readonly DependencyProperty KinectSensorProperty =
            DependencyProperty.Register(
                "KinectSensor",
                typeof(KinectSensor),
                typeof(KinectWindow),
                new PropertyMetadata(null));

        private readonly KinectWindowViewModel viewModel;
        /// <summary>
        /// Initializes a new instance of the KinectWindow class, which provides access to many KinectSensor settings
        /// and output visualization.
        /// </summary>
        public KinectWindow()
        {
            this.viewModel = new KinectWindowViewModel();

            // The KinectSensorManager class is a wrapper for a KinectSensor that adds
            // state logic and property change/binding/etc support, and is the data model
            // for KinectDiagnosticViewer.
            this.viewModel.KinectSensorManager = new KinectSensorManager();

            Binding sensorBinding = new Binding("KinectSensor");
            sensorBinding.Source = this;
            BindingOperations.SetBinding(this.viewModel.KinectSensorManager, KinectSensorManager.KinectSensorProperty, sensorBinding);

            // Attempt to turn on Skeleton Tracking for each Kinect Sensor
            this.viewModel.KinectSensorManager.SkeletonStreamEnabled = true;

            this.DataContext = this.viewModel;

            InitializeComponent();
        }

        public KinectSensor KinectSensor
        {
            get { return (KinectSensor)GetValue(KinectSensorProperty); }
            set { SetValue(KinectSensorProperty, value); }
        }

        public void StatusChanged(KinectStatus status)
        {
            this.viewModel.KinectSensorManager.KinectSensorStatus = status;
        }

        private void Swap_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Grid colorFrom = null;
            Grid depthFrom = null;

            if (this.MainViewerHost.Children.Contains(this.ColorVis))
            {
                colorFrom = this.MainViewerHost;
                depthFrom = this.SideViewerHost;
            }
            else
            {
                colorFrom = this.SideViewerHost;
                depthFrom = this.MainViewerHost;
            }

            colorFrom.Children.Remove(this.ColorVis);
            depthFrom.Children.Remove(this.DepthVis);
            colorFrom.Children.Insert(0, this.DepthVis);
            depthFrom.Children.Insert(0, this.ColorVis);
        }
        public KinectSkeleton ks = new KinectSkeleton();
        private void Calibrate_Click(object sender, RoutedEventArgs e)
        {

            ks.setcurrentdt();

        }

        private void AngleDifference_Checked(object sender, RoutedEventArgs e)
        {

            ks.is_checked = true;
        }

        private void AngleDifference_Unchecked(object sender, RoutedEventArgs e)
        {
            ks.is_checked = false;
        }


            }
}

    /// <summary>
    /// A ViewModel for a KinectWindow.
    /// </summary>
    public class KinectWindowViewModel : DependencyObject
    {
        public static readonly DependencyProperty KinectSensorManagerProperty =
            DependencyProperty.Register(
                "KinectSensorManager",
                typeof(KinectSensorManager),
                typeof(KinectWindowViewModel),
                new PropertyMetadata(null));

        public KinectSensorManager KinectSensorManager
        {
            get { return (KinectSensorManager)GetValue(KinectSensorManagerProperty); }
            set { SetValue(KinectSensorManagerProperty, value); }
        }
    }


}

namespace Microsoft.Samples.Kinect.WpfViewers
{
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using Microsoft.Kinect;
    using System.Data;
    using System.Windows.Media.Media3D;
    using System.Globalization;

    /// <summary>
    /// This control is used to render a player's skeleton.
    /// If the ClipToBounds is set to "false", it will be allowed to overdraw
    /// it's bounds.
    /// </summary>
    public class KinectSkeleton : Control
    {
        public bool is_checked=false;
        public DataTable x = new DataTable();
        public DataTable y = new DataTable();
protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            var currentSkeleton = this.Skeleton;

            // Don't render if we don't have a skeleton, or it isn't tracked
            if (drawingContext == null || currentSkeleton == null || currentSkeleton.TrackingState == SkeletonTrackingState.NotTracked)
            {
                return;
            }

            // Displays a gradient near the edge of the display where the skeleton is leaving the screen
            this.RenderClippedEdges(drawingContext);

            switch (currentSkeleton.TrackingState)
            {
                case SkeletonTrackingState.PositionOnly:
                    if (this.ShowCenter)
                    {
                        drawingContext.DrawEllipse(
                            this.centerPointBrush,
                            null,
                            this.Center,
                            BodyCenterThickness * this.ScaleFactor,
                            BodyCenterThickness * this.ScaleFactor);
                    }

                    break;
                case SkeletonTrackingState.Tracked:


                   // here i defined the DataTables



                        if (is_checked == false)
                        {
                            //fill data table x with value a
                        }
                        else
                        {
                            //fill data table x with value b
                        }

                    break;
            }
        }

 public void setcurrentdt()
        {

            //fill empty datatable "y" with filled one "x"
              y = x.Copy();
        }
    }
}

チェックボックスのxamlコード:

   <Window x:Class="Microsoft.Samples.Kinect.KinectExplorer.KinectWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Microsoft.Samples.Kinect.KinectExplorer"
        xmlns:kt="clr-namespace:Microsoft.Samples.Kinect.WpfViewers;assembly=Microsoft.Samples.Kinect.WpfViewers"
        Title="Kinect Explorer" Width="839" Height="768">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/Microsoft.Samples.Kinect.WpfViewers;component/KinectControlResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <local:KinectWindowsViewerSwapCommand x:Key="SwapCommand"/>
        </ResourceDictionary>
    </Window.Resources>
    <Window.CommandBindings>
        <CommandBinding Command="{StaticResource SwapCommand}" Executed="Swap_Executed"/>
    </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Key="Back"  Command="{StaticResource SwapCommand}"/>
    </Window.InputBindings>

    <Grid Name="layoutGrid" Margin="10 0 10 0" TextBlock.FontFamily="{StaticResource KinectFont}">        
        <Grid.RowDefinitions>
            <!-- The title bar -->
            <RowDefinition Height="Auto"/>
            <!-- The main viewer -->
            <RowDefinition Height="*" MinHeight="300"/>
            <!-- The audio panel -->
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <!-- The main viewer -->
            <ColumnDefinition Width="*" MinWidth="400"/>
            <!-- The side panels -->
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <DockPanel Grid.Row="0" Grid.ColumnSpan="2" Margin="10 0 10 20">
            <Image DockPanel.Dock="Left" Source="Images\Logo.png" Stretch="None" HorizontalAlignment="Left" Margin="0 10 0 0"/>
            <TextBlock DockPanel.Dock="Right" 
                       HorizontalAlignment="Right" 
                       VerticalAlignment="Bottom" 
                       Foreground="{StaticResource TitleForegroundBrush}" FontSize="{StaticResource LabelFontSize}">Kinect Explorer</TextBlock>
            <Image Source="Images\Status.png" Stretch="None" HorizontalAlignment="Center"/>
        </DockPanel>

        <!-- The main viewer -->
        <Grid Grid.Column="0" Grid.Row="1" Margin="10" >
            <Grid Name="MainViewerHost">
                <Grid Name="ColorVis" Background="{StaticResource DarkNeutralBrush}">
                    <Viewbox HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="Uniform">
                        <!-- Make the colorViewer and skeletonViewer overlap entirely. -->
                        <Grid>
                            <kt:KinectColorViewer x:Name="ColorViewer" KinectSensorManager="{Binding KinectSensorManager}" CollectFrameRate="True" RetainImageOnSensorChange="True" />
                            <Canvas>
                                <kt:KinectSkeletonViewer 
                                    KinectSensorManager="{Binding KinectSensorManager}"
                                    Visibility="{Binding KinectSensorManager.ColorStreamEnabled, Converter={StaticResource BoolToVisibilityConverter}}"
                                    Width="{Binding ElementName=ColorViewer,Path=ActualWidth}"
                                    Height="{Binding ElementName=ColorViewer,Path=ActualHeight}"
                                    ImageType="Color" />
                            </Canvas>
                        </Grid>
                    </Viewbox>
                    <Border 
                        TextBlock.Foreground="{StaticResource LabelForegroundBrush}" 
                        HorizontalAlignment="Right" VerticalAlignment="Top" 
                        Background="{StaticResource MediumNeutralBrush}"
                        Width="50" Height="50">
                        <StackPanel Orientation="Vertical" >
                            <TextBlock FontSize="{StaticResource HeaderFontSize}" Text="{Binding ElementName=ColorViewer, Path=FrameRate}" HorizontalAlignment="Center" Margin="-2"/>
                            <TextBlock FontSize="{StaticResource FPSFontSize}" HorizontalAlignment="Center" Margin="-2">FPS</TextBlock>
                        </StackPanel>
                    </Border>                   
                    <Rectangle Fill="#7777" Visibility="{Binding KinectSensorManager.ColorStreamEnabled, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=True}"/>
                </Grid>
            </Grid>
        </Grid>

        <!-- The Audio panel -->
        <Grid Grid.Row="2" Grid.Column="0"
              Margin="10 10 10 20"
              VerticalAlignment="Top">
            <kt:KinectAudioViewer 
                x:Name="kinectAudioViewer" 
                HorizontalAlignment="Stretch" 
                VerticalAlignment="Stretch"                 
                KinectSensorManager="{Binding KinectSensorManager}"/>
        </Grid>

        <!-- The side panels-->
        <StackPanel 
            Orientation="Vertical" 
            Grid.Column="1" 
            Grid.Row="1" 
            Grid.RowSpan="2" 
            Margin="10"
            HorizontalAlignment="Left" VerticalAlignment="Top">
            <Grid Name="SideViewerHost" Width="200" Height="150">
                <Grid Name="DepthVis" Background="{StaticResource DarkNeutralBrush}">
                    <Viewbox Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center">
                        <!-- Make the depthViewer and skeletonViewer overlap entirely. -->
                        <Grid>
                            <kt:KinectDepthViewer 
                            x:Name="DepthViewer"
                            KinectSensorManager="{Binding KinectSensorManager}"
                            CollectFrameRate="True" 
                            RetainImageOnSensorChange="True"/>
                            <Canvas>
                                <kt:KinectSkeletonViewer 
                                KinectSensorManager="{Binding KinectSensorManager}"
                                Visibility="{Binding KinectSensorManager.DepthStreamEnabled, Converter={StaticResource BoolToVisibilityConverter}}"
                                Width="{Binding ElementName=DepthViewer, Path=ActualWidth}"
                                Height="{Binding ElementName=DepthViewer, Path=ActualHeight}"
                                ShowBones="true" ShowJoints="true" ShowCenter="true" ImageType="Depth" />
                            </Canvas>
                        </Grid>
                    </Viewbox>
                    <Border 
                        TextBlock.Foreground="{StaticResource LabelForegroundBrush}" 
                        HorizontalAlignment="Right" VerticalAlignment="Top" 
                        Background="{StaticResource MediumNeutralBrush}"
                        Width="50" Height="50">
                        <StackPanel Orientation="Vertical" >                            
                            <TextBlock FontSize="{StaticResource HeaderFontSize}" Text="{Binding ElementName=DepthViewer, Path=FrameRate}" HorizontalAlignment="Center" Margin="-2"/>
                            <TextBlock FontSize="{StaticResource FPSFontSize}" HorizontalAlignment="Center" Margin="-2">FPS</TextBlock>
                        </StackPanel>
                    </Border>
                    <Rectangle Fill="#7777" Visibility="{Binding KinectSensorManager.DepthStreamEnabled, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter=True}"/>
                </Grid>
                <Button HorizontalAlignment="Left" VerticalAlignment="Top" Command="{StaticResource SwapCommand}">
                    <Button.Template>
                        <ControlTemplate>
                            <Border Width="50" Height="50">
                                <Border.Style>
                                    <Style>
                                        <Style.Setters>
                                            <Setter Property="Border.Background" Value="{StaticResource MediumNeutralBrush}"/>
                                        </Style.Setters>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}, Path=IsMouseOver}" Value="True">
                                                <Setter Property="Border.Background" Value="{StaticResource DarkNeutralBrush}"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Border.Style>
                                <Image Source="Images/swap.png"/>
                            </Border>
                        </ControlTemplate>
                    </Button.Template>
                </Button>                
            </Grid>

            <kt:KinectSettings KinectSensorManager="{Binding KinectSensorManager}" Margin="0 20 0 0" />

        </StackPanel>
        <Button Content="Calibrate"  Height="23" x:Name="Calibrate" x:FieldModifier="public" Width="75" Margin="213,45,289,435" Grid.RowSpan="2" Click="Calibrate_Click" />
        <CheckBox Content="AngleDifference"  Height="25" x:Name="AngleDifference" x:FieldModifier="public" Width="135" Margin="0,45,137,433" Grid.RowSpan="2" Checked="AngleDifference_Checked" HorizontalAlignment="Right" Unchecked="AngleDifference_Unchecked" />
    </Grid> 
</Window>

ViewModelクラス:

public class ViewModel
    {

        public bool IsChecked { get; set; }
        public bool is_clicked { get; set; }

    }
4

1 に答える 1

2

完全なKinectWindow.xamlファイルを見たり、SDKをダウンロードしたりせずに、少し推測していますが、問題の原因は次の2つの異なるインスタンスであるように思われますKinectSkeleton

  • ksインスタンス化して、そのプロパティをKinectWindow設定し、呼び出していることis_checkedsetcurrentdt
  • どこかで宣言さKinectWindow.xamlれたものOnRenderが呼び出されています。

この問題を解決するにはどうすればよいですか?

  • で検索KinectSkeletonKinectWindow.xamlます。次のように定義する必要があります(代わりにlocal、別の名前空間プレフィックスを使用できます)。
<local:KinectSkeleton ... />
  • 属性KinextWindow.xaml.csを追加することでコードビハインドから参照できるように、名前を付けます。x:Name名前を付けるとks、既存のコード変更を変更する必要はありません。
<local:KinectSkeleton x:Name="ks" ... />
  • KinectSkeleton衝突を防ぐために、コードビハインドでクラスの宣言を削除します。
public KinectSkeleton ks = new KinectSkeleton();

これで、のインスタンスは1つだけになるKinectSkeletonためOnRender、イベントハンドラーから変更しているのと同じデータで機能します。

于 2012-07-14T13:29:09.860 に答える