如何从我自己的.cs文件访问WPF MainWindow控件

Joh*_*lfe 22 c# wpf controls

我是一个NOVICE,我非常挣扎着看起来应该是一个非常简单的任务.如何MainWindow TextBlock从另一个cs文件修改a的属性.精确的代码解决方案将非常有用.

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

在File: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>
Run Code Online (Sandbox Code Playgroud)

在File:MainWindow.xaml.cs中

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

在File: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";
        }
    }
}  
Run Code Online (Sandbox Code Playgroud)

Nat*_*ips 42

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

((MainWindow)System.Windows.Application.Current.MainWindow).TextBlock1.Text = "Setting Text from My Program";
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但我只想用粗体字母重复:**"但请听那些在实际应用程序中说你会使用MVVM的海报."** (10认同)
  • 很好的答案,但万一有人真的错过了它...**"但请听那些在真实应用程序中说你会使用MVVM的海报"**. (5认同)
  • 我根本没有得到奖金建议的概括。有几个原因需要以这种方式隐藏代码。例如,自定义 style.xaml 的代码隐藏使用过程代码,以便在 xaml 算法不够的方法的样式中使用处理程序。 (4认同)

Kur*_*ran 15

您可以使用MVVM简单地实现此目的.您不应该使用其他类中的名称直接访问View中的控件.您必须使用绑定属性.

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

学生ViewModel

public class Student
{
    public string Name
    {
        get { return "Setting Text from My Program"; }
    }
}
Run Code Online (Sandbox Code Playgroud)

App.Config中

现在,您已将此View Model添加为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>
Run Code Online (Sandbox Code Playgroud)

MainWindow.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>
Run Code Online (Sandbox Code Playgroud)


Jef*_*Son 0

您需要创建 的实例MainWindow

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