我正在尝试在 WPF 和 C# 中使用 Kinect SDK 1.7。
是否有任何选项可以控制 WPF 元素 - 例如 WPF 按钮、WPF 滑块等。我找不到如何执行此操作。当我将 WPF 按钮带到 Kinect 区域时,KinectPointer 不会对这些控件做出反应。我认为这个指针有点像鼠标指针。
请你能帮助我,怎么做?
非常感谢!
我正在尝试在 WPF 和 C# 中使用 Kinect SDK 1.7。
是否有任何选项可以控制 WPF 元素 - 例如 WPF 按钮、WPF 滑块等。我找不到如何执行此操作。当我将 WPF 按钮带到 Kinect 区域时,KinectPointer 不会对这些控件做出反应。我认为这个指针有点像鼠标指针。
请你能帮助我,怎么做?
非常感谢!
此链接可能会帮助您 Kinectify 您自己的控制器。该示例是关于一个复选框,但您也可以将其扩展到其他控制器:
public class MyCheckBox : CheckBox
{
private static readonly bool IsInDesignMode = DesignerProperties.GetIsInDesignMode(new DependencyObject());
private HandPointer _capturedHandPointer;
public MyCheckBox()
{
if (!IsInDesignMode)
{
Initialise();
}
}
private void Initialise()
{
KinectRegion.AddHandPointerPressHandler(this, this.OnHandPointerPress);
KinectRegion.AddHandPointerGotCaptureHandler(this, this.OnHandPointerCaptured);
KinectRegion.AddHandPointerPressReleaseHandler(this, this.OnHandPointerPressRelease);
KinectRegion.AddHandPointerLostCaptureHandler(this, this.OnHandPointerLostCapture);
KinectRegion.AddHandPointerEnterHandler(this, this.OnHandPointerEnter);
KinectRegion.AddHandPointerLeaveHandler(this, this.OnHandPointerLeave);
KinectRegion.SetIsPressTarget(this, true);
}
}
private void OnHandPointerLeave(object sender, HandPointerEventArgs e)
{
if (!KinectRegion.GetIsPrimaryHandPointerOver(this))
{
VisualStateManager.GoToState(this, "Normal", true);
}
}
private void OnHandPointerEnter(object sender, HandPointerEventArgs e)
{
if (KinectRegion.GetIsPrimaryHandPointerOver(this))
{
VisualStateManager.GoToState(this, "MouseOver", true);
}
}
private void OnHandPointerLostCapture(object sender, HandPointerEventArgs e)
{
if (_capturedHandPointer == e.HandPointer)
{
_capturedHandPointer = null;
IsPressed = false;
e.Handled = true;
}
}
private void OnHandPointerCaptured(object sender, HandPointerEventArgs e)
{
if (_capturedHandPointer == null)
{
_capturedHandPointer = e.HandPointer;
IsPressed = true;
e.Handled = true;
}
}
private void OnHandPointerPress(object sender, HandPointerEventArgs e)
{
if (_capturedHandPointer == null && e.HandPointer.IsPrimaryUser && e.HandPointer.IsPrimaryHandOfUser)
{
e.HandPointer.Capture(this);
e.Handled = true;
}
}
private void OnHandPointerPressRelease(object sender, HandPointerEventArgs e)
{
if (_capturedHandPointer == e.HandPointer)
{
if (e.HandPointer.GetIsOver(this))
{
OnClick();
VisualStateManager.GoToState(this, "MouseOver", true);
}
else
{
VisualStateManager.GoToState(this, "Normal", true);
}
e.Handled = true;
}
}
KinectPointer 与普通的 Mousepointer 完全不同,它不适用于开箱即用的普通 WPF 控件。
请查看 kinect 区域可用的事件:
http://msdn.microsoft.com/en-us/library/microsoft.kinect.toolkit.controls.kinectregion_events.aspx
如果我没记错的话,Kinect Interaction Tookit Controls 的源代码包含在 SDK 中,请查看 KinectButtonBase.cs 了解如何开发 Kinect-Controls。