C# 如何从我自己的.cs文件访问WPF主窗口控件
我是一个新手,正在努力完成一项看似简单的任务。如何从另一个cs文件修改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
主窗口的属性。精确的代码解决方案将非常有用
下面是精简的代码。使用静态类是否会给我带来额外的问题
在文件中: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";