2016-07-05 6 views
-1

コマンドウィンドウにテキストを印刷するコンソールアプリケーションがあるとします。 Logger WPFウィンドウもあり、出力を複製する必要があります。私は新しいスレッド(STA)の内部でウィンドウを作成するためのIDE力:スレッドが開始された後、私はtextBlock.TextにアクセスするにはどうすればよいコンソールアプリケーションからUI要素にアクセスする方法

public SomeClass() 
{ 
    var loggerThread = new Thread(() => 
    { 
     var logWindow = new Window 
     { 
      Title = "Logger", Width = 100, Height = 100 
     }; 

     var stackPanel = new StackPanel 
     { 
      Name = "stackPanel" 
     }; 

     stackPanel.Children.Add(new TextBlock 
     { 
      Name = "textBlock", Text = "new text\n" 
     }); 

     logWindow.Content = stackPanel; 
     logWindow.ShowDialog(); 
    }); 

    loggerThread.SetApartmentState(ApartmentState.STA); 
    loggerThread.IsBackground = true; 
    loggerThread.Start(); 
} 

public void PutInfo(string msg) 
{ 
    // how to access textBlock here? 
    ...textBlock.Text = "some info"; 
} 

。 つまり、PutInfo()メソッドを介して別のクラスからそのスレッドのUI要素にアクセスする方法は?

+1

検索を使用して、あなたがDescriptionを変更するたびに制御

<TextBox Text="{Binding Description, source="Your Logger"}"/> 

を更新するために必要とされています。 ところで、これは、例えば、 http://stackoverflow.com/questions/11625208/accessing-ui-main-thread-safely-in-wpf – Andre

答えて

1

あなたは Aコンソールアプリはありませんグラフィカル要素

A WPFアプリでアプリです、ここでは行のカップルを超えているが、WPFは、インタフェースを定義してグラフィカル・ユーザー・インターフェースを持っているアプリです。あなたは、あなたがユーザーたSystem.DiagnosticsのProcessクラスをキャプチャすることができますGUIでコンソールアプリケーションの出力を記録しようとしている場合

はそう定義して、コンソールアプリは現在、GUI

を持つことができないとここできちんと説明されているコンソール出力チャンネルを表示してくださいCapturing console output from a .NET application (C#)

コンソールアプリケーションが別のGUIアプリケーションコントロールを直接制御して、メモリ管理に違反し、管理されていないメモリポインタを使用するようにしたい場合は推奨しませんこの

あなたがjusならWPFのテキストブロックを更新しようとtは、そのちょうど例えば

public class Logger:INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged 
    private string _Description; 
    public static readonly PropertyChangedEventArgs DescriptionProperty = new PropertyChangedEventArgs(nameof(Description)); 

    public string Description 
    { 
     get { return _Description; } 
     set 
     { 
      _Description = value; 
      PropertyChanged?.Involke(this, DescriptionProperty); 
     } 
    } 
} 

を更新するために、バインディングを使用し、その後INotifyPropertyChangedのを実装して監視可能なコレクションまたは文字列のプロパティ内のテキストを保存し、のいずれかによって観測可能であるためにあなたのロガークラスを設定し、簡単ですこれは、すべてこれはセッターのTextBlockアップデートのSynchronizationContextのために自動的に

+0

新しいスレッドでウィンドウを作成します。問題は、テキストフィールドを更新するために、他のクラスからウィンドウのUI要素にアクセスすることです。 – andreikashin

+0

あなたが望むのは、テキストを更新することだけです。あなたがそれを複雑にすることを大量にしており、その言葉に不満を抱いています。 WPFをバインドする方法を示す更新された回答 – MikeT

関連する問題