🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

3586閲覧

別クラスからTextBlockの文字をリアルタイムで変更したい

mia1620

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2019/10/01 03:50

前提・実現したいこと

WPFを使っています。別のクラスから出力文字を指定し、TextBlockの文字の表示をリアルタイムに変更したいです。

以前、プログレスバーをリアルタイムに更新したいと相談させていただいたところ、
リアルタイムに更新するのであれば再描画をしたら良いとの回答をいただき、今回も再描画の処理を行っています。(Refresh部分)
Refreshの部分は以下のサイトを参考にしました。
http://geekswithblogs.net/NewThingsILearned/archive/2008/08/25/refresh--update-wpf-controls.aspx

MainWindow.xaml.csでのthis.Result();はリアルタイムに更新されますが、Namber.csは更新されず、フォームには開始→終了という表示になってしまいます。
コンソールで動作中も確認してみたのですが、あきらかにNamber.csの他の処理をしている途中でもフォームでは開始のままになっていました。
Namber.csで直接main.Refresh();としてもできませんでした。

フォームのTextBlockの文字を変更するときはMainでないとできないのでしょうか?
皆様ご教授お願いいたします。

該当のソースコード

文字の表示に関係ない処理の部分は省略していますが、以下のソースです。

MainWindow.xaml.cs

C#

1public partial class MainWindow:System.Windows.Window 2{ 3 public MainWindow() 4 { 5 InitializeComponent(); 6 } 7 private void btn_Click(object sender, RoutedEventArges e) 8 { 9 for(int i=0; i<5; i++) 10 { 11 this.Result("開始");   12   Namber namber=new Namber(); 13 namber.Input(12); 14 this.Result("終了"); 15 } 16 } 17 18 public void Result(string result) 19 { 20 txResult.Text=result; 21  txResult.Refresh(); 22 } 23} 24 25public static class ExtensionMethods 26{ 27 private static System.Action EmptyDelegate=delegate(){}; 28 public static void Refresh(this UIElement uiElement) 29 { 30 uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyFelegate); 31 } 32} 33

Namber.cs

C#

1class Namber 2{ 3 public void Input(int num) 4 { 5 string Str=num.ToString()+"が入力された"; 6 MainWindow main=new MainWindow(); 7 main.Result(Str); 8  ==他の処理== 9 } 10}

補足情報(FW/ツールのバージョンなど)

VisualStudio 2015
.NetFreamwork 4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Namberクラス内でMainWindowをnewして別インスタンスを操作しているからでは?

投稿2019/10/01 04:12

YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mia1620

2019/10/01 05:13 編集

回答ありがとうございます。 newしてはいけないのですか。 すみません、別のクラスから使う場合にはnewしないといけないと思っていたので。 newせずにMainWindowを操作したい場合、どう書けばいいのでしょうか? MainWindow main=MainWindow();とするとメソッドのようにしようできませんと出ますし、 直接MainWindow.Resultはできないと思いますし。。。 かなり初歩的なところだと思うので申し訳ないのですが、教えていただけないでしょうか?
YAmaGNZ

2019/10/01 04:37

Namberクラスはどこからどのようにしてインスタンスを作成しているのでしょうか? もし、MainWindowからでしたら、そこから自分のインスタンスを渡すようにすればいいでしょう。 インスタンスが何なのか分からないのであれば、そこから学習すべきです。
mia1620

2019/10/01 04:58

ありがとうございます。 MainWindowからインスタンスを作成している認識です。 おっしゃる通りです。中途半端にしか理解できていないのでもう一度インスタンス関係を勉強し直して考えようと思います。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問