24

私は初心者で、非常に単純な作業のように見えることに非常に苦労しています。MainWindow TextBlockのプロパティを別の 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>

ファイル内: 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

これで、この 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>

MainWindow.xaml

App.config に追加されたリソース キーで を設定DataContextし、Student View Model で定義されたプロパティへのバインディングを設定します。

<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. CONSTRUCTOR ではなくウィンドウ LOADED の後にコード (2) を使用することをお勧めします。
  2. コンストラクターのコード (2) は、実行時の問題を残す可能性があります。
  3. もう 1 つの簡単な方法は、各クラスのコンストラクターに渡すことによって「ref MainWindow_field」を使用するか、「(MainWindow) Application.Current.MainWindow」を静的 Main に割り当てることです。
于 2015-12-11T22:38:48.770 に答える
0

コンパイルされない理由については、あなたが得ているコンパイラエラーは...

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

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 に答える