C# 无法从用户类访问WPF元素

C# 无法从用户类访问WPF元素,c#,wpf,C#,Wpf,下面粘贴的是我的WPF项目部分C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; usin

下面粘贴的是我的WPF项目部分C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public class sc
        {
            string name, content, stopol, client, bkpset;
            public void getndadd()
            {
            }
        }
        sc obj = new sc();

        private void button1_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
命名空间WpfApplication1
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
公开课理学士
{
字符串名称、内容、stopol、客户端、bkpset;
public void getndadd()
{
}
}
sc obj=新的sc();
私有无效按钮1\u单击(对象发送者,路由目标)
{
}
}
}
我创建了一些文本框和标签。单击按钮(button1_Click)时,我希望将值存储在类“sc”的对象中。 为此,我编写了一个方法getndadd()。但我似乎无法在键入时获取文本框、标签或任何WPF元素

知道为什么吗?我把我想要的和我实际得到的贴在下面


发生这种情况是因为作用域的类别不同。为了传输textbox,您需要接近类sc(getndadd())获取一个参数(例如FrameworkElement),以便将其传输到一个值

public class sc
{
  string name, content, stopol, client, bkpset;
  public void getndadd(FrameworkElement element)
  {
     var elem = element;
     ...
  }
}

 public MainWindow()
 {
    InitializeComponent();
    sc.getndadd(textBox1);
 }

您的窗口是
MainWindow
类的一个实例。单击按钮1时,
button1\u click
被调用,这是一个成员函数,因此它可以访问该窗口的所有属性,包括
textBox1

您的
sc
类(或者更确切地说,它的实例)对您的窗口一无所知。您可以创建一个
sc
实例,而无需打开任何窗口,也可以有多个窗口。。。在这种情况下,
sc
应该使用哪个文本框

一种解决方案是将引用传递到
main窗口
实例:

public class sc
{
    // (...)

    public void getndadd(MainWindow window)
    {
        // Here, you can access window.textBox1, and any other public properties
    }
}
private void button1_Click(object sender, RoutedEventArgs e)
{
    obj.name = textBox1.Text;
    // and so on...
}
或者您可以让
按钮1\u单击
设置
sc
实例的各个字段:

public class sc
{
    // (...)

    public void getndadd(MainWindow window)
    {
        // Here, you can access window.textBox1, and any other public properties
    }
}
private void button1_Click(object sender, RoutedEventArgs e)
{
    obj.name = textBox1.Text;
    // and so on...
}
然而,WPF附带了一个所谓的“数据绑定”系统,可以自动执行此操作。每个WPF元素都有一个DataContext属性。您可以将元素属性链接到其DataContext中的属性,例如:

<Label Content="{Binding Description}" />
等等。如果希望在更改代码中的其中一个属性时自动更新视图,则必须实现
INotifyPropertyChanged
接口,并在每个属性的setter中引发
PropertyChanged
事件,以便WPF知道属性(以及哪个属性)何时更改


最后一点注意:你的一些名字很不规范——我不知道
sc
getndadd
代表什么,或者它们应该做什么。另外,C#中的类和方法名是按约定进行大小写的。

谢谢,但是如何一次传递所有元素呢?我不想将sc.getndadd(textbox1)…sc.getndadd(textbox5)作为5个不同的语句包含在不同的文本框中,或者向方法传递太多的参数。还有更有效的吗?顺便问一下,你的回答中是指不同的“类别范围”吗?uve编写了“作用域类”来传递所有元素:选项1:发送MainWindow实例(getndadd(MainWindow窗口))并获取窗口中的所有元素选项2:发送基本类型(窗口)并获取其逻辑树。