【问题标题】:Calling method for TextBlock in MainWindow class from other class [duplicate]从其他类调用MainWindow类中TextBlock的方法[重复]
【发布时间】:2019-07-25 23:32:47
【问题描述】:

我正在 WPF 中构建一个界面。我的 MainWindow 类可以访问我在窗口中创建的 TextBlock。它可以通过调用 textblock.text 方法将文本写入此 TextBlock。

然后我创建了第二个类,它在程序启动时立即实例化。这个类有一个我创建的方法,它看不到那个文本块。我如何才能访问在 MainWindow 中可访问的 .text 方法?

谢谢

MainWindow.xaml.cs

    {

        ButtonFunctions buttonFunctions = new ButtonFunctions();


        public MainWindow()
        {
            InitializeComponent();
            ProgressBar ProgBar = new ProgressBar();
        }
//this works
textBlock.Text = "r";

ButtonFunctions.cs

    {

        public ButtonFunctions()
        {

        }

        public void Addtext(string t)
        {
            //this doesn't work
            textBlock.Text += t;
            //this doesnt work either
            MainWindow.textBlock.Text="r";
        }

如果我尝试调用 MainWindow 方法,我会收到以下错误。 非静态字段、方法或属性“MainWindow.textBlock.Text”需要对象引用 这种情况下需要什么对象引用?

【问题讨论】:

  • 你应该添加WPF标签
  • 也许你可以将 textBlock 从 MainWindow 传递给 Addtext 方法,然后你可以在那个范围内使用它。
  • 根本问题是您试图在不提供对象引用的情况下访问非静态成员。当您在 Stack Overflow 中搜索错误消息时,您应该找到的详细信息请参见标记的重复项。也就是说,这是因为您的代码存在更广泛的问题:您正在直接操作 UI 对象的属性,而不是像 WPF 设计使用的那样使用 MVVM。然后,通过假设只有一个 MainWindow 对象并允许随机代码直接修改文本,您可以按照您在下面发布的答案中的描述来复合这个设计问题。

标签: c# wpf class methods


【解决方案1】:

您正在尝试引用 MainWindow.textBlock ,就好像它是静态的一样。您需要引用您的窗口 MainWindow 的现有实例。其次,您可能无法从另一个线程/上下文设置值。我不太了解 WPF,但在 Windows 窗体中您需要调用访问器。也许看看这个Invoke WPF Setter manually

【讨论】:

    【解决方案2】:

    感谢您的回复。我今天终于有时间坐下来尝试一些更改以找到解决方案。我已经确定了一件可行的事情,尽管可能不是最好的。

    我已将 Addtext 方法移回 MainWindow.xaml.cs,并静态创建了一个名为 AppWindow 的 MainWindow 对象,然后我从其他类中引用该对象。

    例如在我的 ButtonFunctions 类中,我调用 MainWindow.AppWindow.Addtext("text to change");现在将文本放在主窗口的文本块中。下面是一个更大的代码,因此您可以参考和使用它,以防其他人遇到问题。

    public partial class MainWindow : Window
           {
            ButtonFunctions buttonFunctions = new ButtonFunctions();
            public static MainWindow AppWindow;
    
            public MainWindow()
            {
                InitializeComponent();
                ProgressBar ProgBar = new ProgressBar();
                AppWindow = this;
            }
            public void Addtext(string t)
            {
                textBlock.Text += t;
            }
           }
    

    然后在另一个类中,我只是调用这个方法。

    MainWindow.AppWindow.Addtext("\nConnection to server started...\n");
    

    希望这对遇到同样问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多