1

我正在开发一个 WPF Kinect 项目。它是 Windows Kinect 的开发工具包示例之一,被称为“Kinect Explorer”。您可以从 Kinect Developer Toolkit SDK 1.5 版下载它。在 kinectwindow.xaml 我添加了一个按钮和一个复选框。此外,还有一个名为 kinectskeleton.cs 的类,我在其中创建了两个数据表和一个布尔变量。第一个DataTable填充OnRender函数,而另一个为空。布尔变量默认设置为 false。所以,我想要的是当按下 kinectwindow.xaml.cs 中的按钮时,填充的最新数据DataTable被复制到空的。然后,当复选框被选中时,布尔值设置为 true。那么,如何做到这一点呢?

我在 kinectskeleton.cs 类中定义了一个函数,它将数据从填充复制到空DataTable。在OnClickkinectwindow.xaml.cs 的按钮函数中,我从类中创建了一个对象kinectskeleton并调用了该函数,但两个 DataTables 都是空的。函数中的复选框也是如此CheckBox_Checked:我将类的布尔值设置kinectskelton为 true(在未选中的函数中,我将其设置为 false)。但是,结果是在kinectskelton类中它总是设置为默认值 (false),并且永远不会进入我为它设置的 if 条件,以便在它为 true 时输入。

希望现在更清楚,等待任何建议。要下载该工具包,请点击以下链接: 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();
        }
    }
}

复选框的xml代码:

   <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>

视图模型类:

public class ViewModel
    {

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

    }
4

1 回答 1

2

在没有看到完整KinectWindow.xaml文件或下载 SDK 的情况下,我进行了一些猜测,但在我看来,您的问题是由以下两个不同实例引起的KinectSkeleton

  • ks您正在实例化KinectWindow,设置其is_checked属性并调用setcurrentdt
  • 被调用的某处声明KinectWindow.xaml的那个。OnRender

如何解决这个问题?

  • KinectSkeleton中查找KinectWindow.xaml。它应该像这样定义(而不是local,可以使用不同的命名空间前缀):
<local:KinectSkeleton ... />
  • 给它一个名称,以便您可以KinextWindow.xaml.cs通过添加x:Name属性从后面的代码中引用它。如果您命名它,ks您将不需要更改现有的代码修改:
<local:KinectSkeleton x:Name="ks" ... />
  • 删除KinectSkeleton后面代码中的类声明以防止冲突:
public KinectSkeleton ks = new KinectSkeleton();

现在您将只有一个KinectSkeleton, 因此OnRender将使用您从事件处理程序修改的相同数据。

于 2012-07-14T13:29:09.860 回答