私はNOVICEであり、非常に単純なタスクと思われることに非常に苦労しています。別のcsファイルからMainWindow
TextBlock
のプロパティを変更するにはどうすればよいですか。正確なコードソリューションは非常に役立ちます。
以下は削除されたコードです。静的クラスを使用すると、余分な問題が発生しますか?
ファイル内: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";
}
}
}
他の誰も実際に質問に答えていないので、私はあなたが望むものを達成する方法を教えますが、実際のアプリケーションではMVVMを使用すると言ったポスターを聞いてください。ただし、求めていることを実行する必要がある場合があるため、必要なコードは次のとおりです。
((MainWindow)System.Windows.Application.Current.MainWindow).TextBlock1.Text = "Setting Text from My Program";
これは、MVVMを使用して簡単に実現できます。別のクラスの名前を使用して、Viewのコントロールに直接アクセスしないでください。バインディングプロパティを使用する必要があります。
まずクラスを追加します。これはViewModelになります。このクラスにプロパティを追加します。このプロパティはViewで入力コントロールにバインドされます。
Student ViewModel
public class Student
{
public string Name
{
get { return "Setting Text from My Program"; }
}
}
App.Config
App.Configファイルのリソースとして、このビューモデルに追加しました。まず、あなたのVMが存在するapp.configに名前空間参照を追加します。[xmlns:local = "clr-namespace:WpfApplication2]。VM View Modelクラス名(生徒)を指定して、リソースとしてクラスを作成します。
<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>
基本的に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.
}
}
注:-
- CONSTRUCTORではなくLOADEDウィンドウの後にコード(2)を使用することをお勧めします。
- コンストラクターのコード(2)は、実行時の問題を残す場合があります。
- 別の簡単な方法は、各クラスのConstructor ORに '(MainWindow)Application.Current.MainWindow'を静的Mainに割り当てることにより、 'ref MainWindow_field'を使用することです。
つかいます MVVM pattern
コントロールのプロパティにアクセスして変更するには:
public class Student
{
public Student()
{
}
public string Name
{
get { return "Setting Text from My Program"; }
}
}
コードビハインドでDataContext
のXAML
を設定します。
this.DataContext = new Student();
TextプロパティをNameにバインドします。
<TextBlock Text="{Binding Name}"/>
ネイサンが言ったことを拡張するために、安全なキャストを使用しました。
(System.Windows.Application.Current.MainWindow as MainWindow)?.TextBlock1.Text = "Setting Text from My Program";
Nathanが答えた のコメントに注意してください。これは理想的ではありませんが、動作します。
MainWindow
のインスタンスを作成する必要があります。
しかし、WPFアプリで自動的に行われるため、そうする理由はないはずです。あなたがそれをする特別な理由がない限り(この質問のため、そしてあなたは初心者だと言うので私は疑います)。
コンパイルできない理由については、あなたが得ているコンパイラエラーは...
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();