tutorial que ejemplos custom controles control c# wpf controls

ejemplos - wpf c# que es



Cómo acceder a los controles de WPF MainWindow desde mi propio archivo.cs (7)

Como nadie más ha respondido la pregunta, le voy a decir cómo lograr lo que quiere, pero escuche los carteles que dicen que en una aplicación real utilizaría MVVM. Sin embargo, hay ocasiones en las que debe hacer lo que pide, por lo que el código que necesita es:

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

Soy un NOVICE y estoy luchando mucho con lo que parece ser una tarea muy simple. ¿Cómo modifico una propiedad de un MainWindow TextBlock , desde otro archivo cs? Una solución de código exacto sería extremadamente útil.

A continuación se muestra el código simplificado. ¿Mi uso de la clase estática me está causando problemas adicionales?

En Archivo: 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>

En Archivo: MainWindow.xaml.cs

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

En Archivo: 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"; } } }


En cuanto a por qué no se compilará, asumiré que el error del compilador que está obteniendo es ...

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

Esto sucede porque está intentando acceder a un TextBlock1 como si fuera estático. Como lo dijo @JeffRSon, primero cree una instancia de su clase MainWindow.

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

Supongo que es posible que desee visualizar la ventana también ...

mainWindow.ShowDialog();


Necesitas crear una instancia de MainWindow .

Pero no debería haber una razón para hacerlo porque se hará de forma automática en una aplicación WPF. A menos que tenga una razón específica para hacerlo (lo cual dudo debido a esta pregunta y porque dice que es un novato).


Para extenderme en lo que dijo Nathan, usé un elenco seguro:

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

Tenga en cuenta los comentarios sobre la respuesta que dio Nathan . Esto no es ideal pero funciona.


Simplemente puede lograr esto utilizando MVVM. No debe acceder directamente a los controles en Vista utilizando su nombre de otra clase. Tienes que usar propiedades de enlace.

En primer lugar, agregue una clase, este será su ViewModel. Agregue sus propiedades a esta clase que se vinculará a sus controles de entrada en su Vista .

Student ViewModel

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

App.Config

Ahora tiene que agregar a este modelo de vista como un recurso en su archivo App.Config . Primero agregue la referencia del espacio de nombres a su app.config donde reside su VM. [xmlns: local = "clr-namespace: WpfApplication2]. Agregue su clase de VM como un recurso especificando el nombre de clase de su modelo de vista (alumno).

<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>

MainWindow.xaml

Configure el DataContext con la clave de recursos agregada a App.config y establezca el enlace a la propiedad definida en el Modelo de vista del alumno.

<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>


Use el MVVM pattern para acceder a las propiedades del control y modificarlas:

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

Establezca el DataContext de XAML en el código detrás de:

this.DataContext = new Student();

Enlazar la propiedad de texto a nombre:

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


Básicamente hay más de 2-3 métodos. El método dado es bastante más fácil de entender y manejar. Puede acceder a los controles de MainWindow siguiendo los códigos (1), (2), (3), (4).

En Archivo: 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(); } }

En Archivo: 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. } }

Notas: -

  1. Es una buena práctica usar el código (2) después de la ventana CARGADO, no en CONSTRUCTOR.
  2. El código (2) en el constructor puede dejar problemas en tiempo de ejecución.
  3. Otro método simple es usar ''ref MainWindow_field'' al pasar al Constructor de cada clase O asignar ''(MainWindow) Application.Current.MainWindow'' a Main estático.