Tak*_*Tak 27 c# wpf checkbox xaml kinect
我在wpf应用程序中工作,我在XAML中创建了一个复选框,然后我的代码在一个类中调用一个函数,在这个函数中有一个if条件,它检查复选框是否被选中但是没有看到复选框在这堂课上,怎么做呢?
非常感谢
编辑:
这是我做的步骤:我在KinectSkeleton的同一项目下创建了ViewModel类,如下所示:ViewModel类:
public class ViewModel
{
public bool IsChecked { get; set; }
public bool is_clicked { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在KinectSkeleton中我定义了一个属性,如下所示:
public static readonly DependencyProperty ViewModelProperty =
DependencyProperty.Register("ViewModelH", typeof(ViewModel), typeof(KinectSkeleton), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
public ViewModel ViewModelH
{
get
{
return (ViewModel)GetValue(ViewModelProperty);
}
set
{
SetValue(ViewModelProperty, value);
}
}
Run Code Online (Sandbox Code Playgroud)
并且KinectWindow.xaml中的复选框和按钮的代码是:
<Button Content="Calibrate" Height="24" x:Name="Calibrate" x:FieldModifier="public" Width="90" Click="Calibrate_Click" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Left" DockPanel.Dock="Left" Panel.ZIndex="0" Padding="0" VerticalAlignment="Center" />
<CheckBox IsChecked="{Binding Mode=TwoWay, Path=IsChecked}" Content="AngleDifference" Height="22" x:Name="AngleDifference" x:FieldModifier="public" Width="117" Checked="AngleDifference_Checked" Unchecked="AngleDifference_Unchecked" HorizontalAlignment="Left" VerticalAlignment="Center" Panel.ZIndex="1" HorizontalContentAlignment="Left" />
Run Code Online (Sandbox Code Playgroud)
并在KinectSkeleton中,我想检查我写的复选框的值:
if (this.ViewModelH.IsChecked == false)
// if(f.is_chekced==false)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道在复选框的is_checked事件中写什么,并按下is_clicked按钮?我的上述步骤中还有什么遗漏,因为我觉得到目前为止,kinect骨架属性没有绑定到复选框is_checked值?
Dam*_*Arh 61
使用以下XML,您可以将控件定义为类上的公共字段,以便能够从其他类访问它:
<CheckBox x:Name="myCheckBox" x:FieldModifier="public" />
Run Code Online (Sandbox Code Playgroud)
现在您可以直接在代码中访问该字段:
if (win.myCheckBox.IsChecked.Value)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
不过,我同意HB的观点,使用MVVM模式是一种更好的方法.代码的其他部分不应该知道您的UI或直接访问它.
编辑:
使用MVVM方法,您应该首先定义视图模型类:
public class ViewModel
{
public bool IsChecked { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后将此类的实例设置为DataContext:
Run Code Online (Sandbox Code Playgroud)public MyWindow() { InitializeComponent(); DataContext = new ViewModel(); }
Run Code Online (Sandbox Code Playgroud)<Application x:Class="WpfApplication2.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:WpfApplication2" StartupUri="MainWindow.xaml"> <Application.Resources> <vm:ViewModel x:Key="ViewModel" /> </Application.Resources> </Application>
现在,您可以将CheckBox绑定到ViewModel中的属性:
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" />
Run Code Online (Sandbox Code Playgroud)
剩下的就是将ViewModel实例传递给您的OnRender函数.它存储在DataContext窗口的属性中.
编辑2:
顺便说一句:在你接受答案之前,你真的应该问过这个问题.
我不确定你试图用这个is_clicked属性做什么.要在单击按钮时设置此标志,您需要Command:
public class CalibrateCommand : ICommand
{
private ViewModel viewModel;
public CalibrateCommand(ViewModel viewModel)
{
this.viewModel = viewModel;
}
public void Execute(object parameter)
{
viewModel.IsClicked = true;
}
public bool CanExecute()
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
您将此命令的实例添加到视图模型:
public class ViewModel
{
public bool IsChecked { get; set; }
public bool IsClicked { get; set; }
public ICommand CalibrateCommand { get; set; }
public ViewModel()
{
CalibrateCommand = new CalibrateCommand(this);
}
}
Run Code Online (Sandbox Code Playgroud)
您将它绑定到按钮,如下所示:
<Button Content="Calibrate" Height="24" x:Name="Calibrate" x:FieldModifier="public" Width="90" Click="Calibrate_Click" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Left" DockPanel.Dock="Left" Panel.ZIndex="0" Padding="0" VerticalAlignment="Center" Command="{Binding CalibrateCommand}" />
Run Code Online (Sandbox Code Playgroud)
您不需要处理任何事件,CheckBox并且Button一切都由绑定处理.
如果您添加了依赖项属性,KinectSkeleton则应将其绑定到视图模型:
<kt:KinectSkeleton ViewModelH="{Binding}" />
Run Code Online (Sandbox Code Playgroud)