下面粘贴的是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)
{
}
}
}
我有几个textBoxes&amp;标签已创建。当点击按钮(button1_Click)时,我想将值存储在类&#34; sc&#34;的对象中。 为此,我写了一个方法getndadd()。但我似乎无法在输入时获取文本框,标签或任何WPF元素。
知道为什么吗?我已经粘贴在我想要的东西之下了。我实际上得到了什么。
答案 0 :(得分:1)
这是因为不同类别的范围。为了传输文本框,你需要接近你的类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);
}
答案 1 :(得分:1)
您的窗口是MainWindow
课程的实例。当您单击按钮1时,button1_Click
被调用,这是一个成员函数,因此它可以访问该窗口的所有属性,包括textBox1
。
您的sc
课程(或者更确切地说,它的实例)对您的窗口一无所知。你可以创建一个sc
实例而不打开任何窗口,或者你可以有多个窗口......在这种情况下textBox应该sc
使用?
一种解决方案是将引用传递给MainWindow
实例:
public class sc
{
// (...)
public void getndadd(MainWindow window)
{
// Here, you can access window.textBox1, and any other public properties
}
}
或者您可以让button1_Click
设置sc
个实例的各个字段:
private void button1_Click(object sender, RoutedEventArgs e)
{
obj.name = textBox1.Text;
// and so on...
}
然而,WPF附带了一个所谓的“数据绑定”&#39;可以自动化的系统。每个WPF元素都有一个DataContext属性。您可以将元素属性链接到其DataContext中的属性,例如:
<Label Content="{Binding Description}" />
默认情况下,MainWindow
的DataContext本身就是MainWindow
实例,因此在这种情况下,WPF会检查您的MainWindow
类是否包含Description
属性。如果是,标签将自动显示该属性的值作为其内容。该系统可以双向工作。
如果将MainWindow
的DataContext设置为sc
实例,则可以绑定到其属性(请注意,您需要使用属性才能实现此功能,而不是简单字段):
<Label Content="{Binding name}" />
<Label Content="{Binding content}" />
<Label Content="{Binding stopol}" />
等等。如果您希望在代码中更改其中一个属性时自动更新视图,则必须实现INotifyPropertyChanged
接口,并在每个属性的setter中引发PropertyChanged
事件属性,因此WPF知道何时更改属性(以及属性)。
最后一点:您的一些名字非常不具备说明性 - 我无法说明sc
和getndadd
代表什么或他们应该做什么。此外,C#中的类和方法名称是按照惯例使用CamelCased。