我正在开发 WPF Kinect 项目。它是 Windows Kinect 的开发人员工具包示例之一,称为“Kinect Explorer”。您可以从 Kinect 开发者工具包 SDK 1.5 版下载它。在 kinectwindow.xaml 中,我添加了一个按钮和一个复选框。另外,还有一个名为 kinectsculpture.cs 的类,我在其中创建了两个数据表和一个布尔变量。首先DataTable
被填入OnRender
功能,而另一个是空的。布尔变量默认设置为 false。所以,我想要的是当按下 kinectwindow.xaml.cs 中的按钮时填充的最新数据DataTable
被复制到空的位置。然后,当选中该复选框时,布尔值将设置为 true。那么,如何做到这一点呢?
我在 kinectsculpture.cs 类中定义了一个函数,它将数据从填充的复制到空的DataTable
。在里面OnClick
kinectwindow.xaml.cs按钮的功能,我从类创建了一个对象kinectskeleton
并调用了这个函数,但两个数据表都是空的。与中的复选框相同CheckBox_Checked
功能:我设置类的布尔值kinectskelton
为 true (并且在未经检查的函数中我将其设置为 false)。但是,结果是,在kinectskelton
class 它总是设置为默认值 (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();
}
}
}
复选框的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>
视图模型类:
public class ViewModel
{
public bool IsChecked { get; set; }
public bool is_clicked { get; set; }
}