所以我有一个程序,我告诉用户两个骷髅是否匹配,但问题是我需要通过label
访问class
。我一直得到的错误是
Error1 An object reference is required for the
non-static field, method, or property
'WpfApplication1.MainWindow.matchLabel'
这是我的代码中的内容:
static
标签
static Label matching
{
get { return matchLabel; } //errors here
set { matchLabel = value; } //and here
}
private class Scan
{
private void Start()
{
Skeleton skeleton = new Skeleton();
if (PersonDetected == true)
{
int SkeletonID2 = skeleton.TrackingId;
if (SkeletonID1 == SkeletonID2)
{
matching.Content = "Your IDs are Matching!";
}
else if (SkeletonID2 != SkeletonID1)
{
matching.Content = "Your IDs don't Match.";
}
}
}
private void Stop()
{
if (PersonDetected == true)
{
matching.Content = "Scan Aborted";
}
}
}
基本上我想知道如何在wpf
static
中制作标签,或者是否有其他方法可以做到这一点。
提前致谢
答案 0 :(得分:2)
我认为你可以使用另一种方法,比如@Daniel说,在多线程上使用UI元素是一个坏主意。
如果我的理解是正确的,您只想通知给您的域逻辑的结果,我的方式很简单,创建一个事件:
public event Action<string> MyEvent = delegate { };
if (SkeletonID1 == SkeletonID2)
{
this.MyEvent("Your IDs are Matching!");
}
else if (SkeletonID2 != SkeletonID1)
{
this.MyEvent("Your IDs don't Match.");
}
if (PersonDetected == true)
{
this.MyEvent("Scan Aborted");
}
在WPF视图中
this.MydomainComponent.MyEvent += (x) => { this.matchLabel.Content = x; };
答案 1 :(得分:1)
这是一个坏主意。你不应该在多个线程上创建UI元素。
你真的应该考虑实现MVVM模式。它将使您的代码更加分离并提高可测试性。
答案 2 :(得分:1)
您最好的选择是使用内置的WPF数据绑定。您可以使用MVVM模式,但这不是必需的。
窗口类(XAML)
<Window x:Class="WpfApplication2.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MyWindow" Height="300" Width="300">
<Grid>
<Label Content="{Binding Path=MyLabelValue}" />
</Grid>
</Window>
幕后代码(代码)
using System.Windows;
using System.ComponentModel;
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MyWindow.xaml
/// </summary>
public partial class MyWindow : Window, INotifyPropertyChanged
{
public MyWindow()
{
InitializeComponent();
DataContext = this; // Sets context of binding to the class
}
// Property for binding
private string _mylabelvalue;
public string MyLabelValue
{
get { return _mylabelvalue; }
set
{
_mylabelvalue = value;
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("MyLabelValue"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
通过在窗口上设置/调用属性时使用此方法,您将获得标签的值。更改属性时 - 通过数据绑定和INotifyPropertyChanged接口更新UI中的值。我有一节介绍如何通过反射和在我的博客上使用MVVM模式。