我正在开发一个 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
。在OnClick
kinectwindow.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; }
}