24

我是一个新手,并且非常努力地完成似乎应该是一个非常简单的任务。如何MainWindow TextBlock从另一个 cs 文件修改 a 的属性。一个精确的代码解决方案将非常有帮助。

下面是精简后的代码。我使用静态类是否会给我带来额外的问题?

在文件中:MainWindow.xaml

<Window x:Class="TestApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock x:Name="TextBlock1" HorizontalAlignment="Left" Margin="107,71,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
    </Grid>
</Window>

在文件中:MainWindow.xaml.cs

namespace TestApp1  
{  
public partial class MainWindow : Window  
    {  
        public MainWindow()  
        {  
            InitializeComponent();  
            TextBlock1.Text = "Setting Text from MainWindow";  
            MyProgram.myProgramStart();  
        }  
    }  
}  

在文件中:CodeFile1.cs

namespace TestApp1
{
    public static class MyProgram
    {
        public static void myProgramStart()
        {
            // ... blah blah blah

            // I want to do something like follows, but won't compile
            MainWindow.TextBlock1.Text = "Setting Text from My Program";
        }
    }
}  
4

7 回答 7

48

因为没有其他人真正回答过这个问题,所以我将告诉你如何实现你想要的,但是请听那些说在实际应用程序中你会使用 MVVM 的发帖人。但是,有时您需要按照您的要求做,因此您需要的代码是:

((MainWindow)System.Windows.Application.Current.MainWindow).TextBlock1.Text = "Setting Text from My Program";
于 2013-12-02T11:08:15.767 回答
16

您可以使用 MVVM 简单地实现这一点。您不应该使用另一个类的名称直接访问 View 中的控件。您必须使用绑定属性。

首先,添加一个类。这将是您的ViewModel。将您的属性添加到此类,该类将绑定到您的View中的输入控件。

学生视图模型

public class Student
{
    public string Name
    {
        get { return "Setting Text from My Program"; }
    }
}

应用程序配置

现在,您已在App.Config文件中将其作为资源添加到此视图模型中。首先,将名称空间引用添加到您的 VM 所在的 app.config。[xmlns:local="clr-namespace:WpfApplication2]. 通过指定 View Model 类名称 (student) 将 VM 类添加为资源。

<Application x:Class="WpfApplication2.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
             xmlns:local="clr-namespace:WpfApplication2">
    
    <Application.Resources>
        <local:Student x:Key="Student" />
    </Application.Resources>
</Application>

主窗口.xaml

DataContext使用添加到 App.config 的资源键进行设置,并将绑定设置为学生视图模型中定义的属性。

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{StaticResource Student}"
        Title="MainWindow" Height="350" Width="525">
    
    <Grid>
        <TextBlock Text="{Binding Name}" Height="23" HorizontalAlignment="Left" Margin="127,124,0,0" Name="textBlock1" VerticalAlignment="Top" Width="214" />
    </Grid>
</Window>
于 2013-06-08T17:17:59.440 回答
4

基本上有2-3种以上的方法。给定的方法更容易理解和处理。您可以通过以下代码(1),(2),(3),(4)访问MainWindow控件。

在文件中:MainWindow.xaml.cs

  public partial class MainWindow
  {
   internal static MainWindow Main; //(1) Declare object as static
   public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
       Main =this; //(2) Defined Main (IMP)
      var AnyClassORWindow=new Class1(); //Initialize another Class
      AnyClassORWindow.ShowValue();
    }
  }

在文件中:Class1.cs

  internal class Class1 : MainWindow //(3) Inherited
    {
      internal void Display()
        {
           MessageBox.Show(Main.TextBox1.Text); //(4) Access MainWindow Controls by adding 'Main' before it.
         }
     }

笔记:-

  1. 最好在窗口 LOADED 后使用代码 (2) 而不是在 CONSTRUCTOR 中。
  2. 构造函数中的代码 (2) 可能会留下运行时问题。
  3. 另一种简单的方法是通过传递给每个类的构造函数来使用“ref MainWindow_field”或将“(MainWindow)Application.Current.MainWindow”分配给静态Main。
于 2015-12-11T22:38:48.770 回答
1

用于MVVM pattern访问控件的属性并修改它们:

public class Student
{
    public Student()
    {
    }

    public string Name
    {
        get { return "Setting Text from My Program"; }
    }
}

在后面的代码中DataContext设置:XAML

this.DataContext = new Student();

将 Text 属性绑定到 Name:

<TextBlock Text="{Binding Name}"/>
于 2013-06-09T06:37:34.257 回答
0

您需要创建一个MainWindow.

但不应该有这样做的理由,因为它将在 WPF 应用程序中自动完成。除非你有特定的理由这样做(我怀疑这个问题,因为你说你是新手)。

于 2013-06-08T16:26:23.433 回答
0

至于为什么它不能编译,我会假设你得到的编译器错误是......

An object reference is required for the non-static field, method, or property 'TestApp1.MainWindow.TextBlock1'

发生这种情况是因为您试图访问 an TextBlock1,就好像它是静态的一样。正如@JeffRSon 所说,首先创建 MainWindow 类的实例。

// Create an instance of MainWindow
var mainWindow = new MainWindow();
mainWindow.TextBlock1.Text = "Setting Text from My Program";

我假设您可能也想显示窗口...

mainWindow.ShowDialog();
于 2013-06-08T17:30:30.317 回答
0

为了扩展 Nathan 所说的,我使用了一个安全的演员表:

(System.Windows.Application.Current.MainWindow as MainWindow)?.TextBlock1.Text = "Setting Text from My Program";

请注意对Nathan 给出的答案的评论。这并不理想,但它有效。

于 2018-08-29T08:03:19.553 回答