Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从我自己的.cs文件访问WPF主窗口控件_C#_Wpf_Controls - Fatal编程技术网

C# 如何从我自己的.cs文件访问WPF主窗口控件

C# 如何从我自己的.cs文件访问WPF主窗口控件,c#,wpf,controls,C#,Wpf,Controls,我是一个新手,正在努力完成一项看似简单的任务。如何从另一个cs文件修改主窗口的属性。精确的代码解决方案将非常有用 下面是精简的代码。使用静态类是否会给我带来额外的问题 在文件中:MainWindow.xaml <Window x:Class="TestApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schema

我是一个新手,正在努力完成一项看似简单的任务。如何从另一个cs文件修改
主窗口的属性。精确的代码解决方案将非常有用

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

在文件中: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>
文件中: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";
        }
    }
}  

您需要创建
MainWindow
的实例


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

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

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

学生视图模型

公共班级学生
{
公共字符串名
{
获取{return“从我的程序设置文本”;}
}
}
App.Config

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


main window.xaml

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


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

非静态字段、方法或属性“TestApp1.MainWindow.TextBlock1”需要对象引用。

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

// Create an instance of MainWindow
var mainWindow = new MainWindow();
mainWindow.TextBlock1.Text = "Setting Text from My Program";
我想您可能也想显示窗口

mainWindow.ShowDialog();

使用
MVVM模式
访问控件的属性并修改它们:

public class Student
{
    public Student()
    {
    }

    public string Name
    {
        get { return "Setting Text from My Program"; }
    }
}
在代码隐藏中设置
XAML
DataContext

this.DataContext = new Student();
将文本属性绑定到名称:

<TextBlock Text="{Binding Name}"/>

因为没有其他人真正回答了这个问题,所以我要告诉你如何实现你想要的,但一定要听海报上说,在真正的应用程序中,你会使用MVVM。然而,有时你需要做你想做的事,所以你需要的代码是:

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

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

文件中: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.
         }
     }
注意事项:-

  • 最好在窗口加载后使用代码(2),而不是在构造函数中
  • 构造函数中的代码(2)可能会留下运行时问题
  • 另一个简单的方法是通过传递给每个类的构造函数或将(MainWindow)Application.Current.MainWindow分配给static Main来使用“ref MainWindow_field”

  • 为了延续内森所说的话,我使用了一个安全模式:

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

    注意上面的评论。这并不理想,但很有效。

    回答不错,但我只想用粗体字重复:“但请听海报上说,在实际应用中,您将使用MVVM。“回答得很好,但万一有人真的错过了……”但一定要听海报上说,在真正的应用程序中,你会使用MVVM“我一点也不明白奖金建议的概括性。有几个原因需要以这种方式隐藏代码。e、 自定义样式.xaml的代码隐藏使用过程代码来使用样式中的处理程序,用于xaml算法不够完善的方法。
    (System.Windows.Application.Current.MainWindow as MainWindow)?.TextBlock1.Text = "Setting Text from My Program";