访问wpf c#应用程序中其他类中XAML的按钮和复选框的值
我在做一个WPF Kinect项目。它是Windows Kinect的开发者工具包示例之一,名为“Kinect浏览器”。您可以从Kinect开发者工具包SDK 1.5版下载。在kinectwindow.xaml中,我添加了一个按钮和一个复选框。另外,还有一个名为kinectskeleton.cs的类,我在其中创建了两个数据表和一个布尔变量。第一个访问wpf c#应用程序中其他类中XAML的按钮和复选框的值,c#,wpf,xaml,kinect,C#,Wpf,Xaml,Kinect,我在做一个WPF Kinect项目。它是Windows Kinect的开发者工具包示例之一,名为“Kinect浏览器”。您可以从Kinect开发者工具包SDK 1.5版下载。在kinectwindow.xaml中,我添加了一个按钮和一个复选框。另外,还有一个名为kinectskeleton.cs的类,我在其中创建了两个数据表和一个布尔变量。第一个DataTable在OnRender函数中填充,而另一个为空。布尔变量默认设置为false。因此,我想要的是当按下kinectwindow.xaml.c
DataTable
在OnRender
函数中填充,而另一个为空。布尔变量默认设置为false。因此,我想要的是当按下kinectwindow.xaml.cs中的按钮时,填充的数据表中的最新数据将复制到空数据表中。然后,选中复选框时,布尔值设置为true。那么,如何做到这一点呢
我在kinectskeleton.cs类中定义了一个函数,该函数将数据从填充的数据表复制到空的数据表。在kinectwindow.xaml.cs按钮的OnClick
函数中,我从类kinectskeleton
创建了一个对象,并调用了该函数,但两个数据表都为空。与checkbox\u Checked
函数中的复选框相同:我将类kinectskelton
的布尔值设置为true(在未选中的函数中,我将其设置为false)。但是,结果是,在kinectskelton
类中,它总是设置为默认值(false),并且从不输入我为它设置的if条件,以便在它为true时输入
希望现在更清楚,等待任何建议。要下载工具包,请访问以下链接:
我的部分代码:
//------------------------------------------------------------------------------
// <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();
}
}
}
在没有看到完整的KinectWindow.xaml
文件或下载SDK的情况下,我有点猜测,但在我看来,您的问题是由两个不同的KinectSkeleton
实例引起的:
- 在
KinectWindow
中实例化的ks
,将选中其属性并调用setcurrentdt
- 在
KinectWindow.xaml
中的某个位置声明的一个,其中调用了OnRender
如何解决这个问题
- 在
KinectWindow.xaml
中查找KinectSkeleton
。应该这样定义它(可以使用不同的名称空间前缀,而不是local
):
- 删除“代码隐藏”中的
KinectSkeleton
类声明以防止冲突:
现在您将只有一个KinectSkeleton
实例,因此OnRender
将使用您从事件处理程序修改的相同数据。在我们看到代码之前,我们无法提供太多建议。尽量将代码示例限制在您认为问题所在的位置-无需发布整个项目。我确信KinectWindow.xaml使用KinectSkeleton,有两个KinectSkeleton查看器&没有KinectSkeleton,我已使用KinectWindow.xaml更新了帖子,我想如果我可以访问复选框的is_checked(选中)和按钮的is_click(单击)也会更容易,对吗?我按照你在上一个问题中告诉我的做了,但在初始化组件()后放置“DataContext=new ViewModel();”时,项目停止工作,因此,2种方法1-从KinectWindow.xaml访问当前的kinectskeleton 2-是从kinectskeleton.cs访问单击并检查的kinectskeleton,那么您能告诉我如何操作吗?@user1460166我想kinectskeleton是在kinectskeleton Viewer中使用的。您应该检查它的cs
和/或xaml
文件。或者在VisualStudio中按Shift+F12,搜索解决方案中使用KinectSkeleton的位置。在您设置自己的DataContext后,应用程序停止工作,因为它已经遵循MVVM模式,并且具有DataContext集(this.DataContext=this.viewModel;
中的KinectWindows
构造函数)。如果要使用绑定,请将属性添加到KinectWindowViewModel
,但一旦您与KinectSkeleton
的正确实例进行交互,您的方法也会起作用。如果我想使用绑定解决方案,其中选中复选框并单击按钮时检索,那么你能在我上面的代码上应用需要做的事情吗?在xaml和cs类中?非常感谢,很抱歉打扰您you@user1460166您是否成功地使用了当前的方法?改变方法不会让你的问题消失。如果您仍然有问题,请尝试按照我之前的说明进行操作。问问你在这方面有什么困难,我会尽力帮助你。
<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; }
}
<local:KinectSkeleton ... />
<local:KinectSkeleton x:Name="ks" ... />
public KinectSkeleton ks = new KinectSkeleton();