2017-02-08 12 views
0

私は、これはスコープの問題であると仮定...しかし、私は、私は助けを必要としてC#ので良いことではないよ...まずC#はwebsocketのWPFオブジェクトにアクセスできませんか?

、私は私のXAMLでのTabControlを持っている:

<TabControl x:Name="tabControl" x:FieldModifier="public" /> 

アイテムをこのTabControlのコードは動的にコードに追加されます。各タブには、UserControlsの束に基づいて追加される「コンテンツ」フィールドがあります。 IEは:tab.Content = new TextFields(this);

他に私のコードのどこかに、私はすべてのタブの名前をエコーするには、以下のことが可能です。

foreach (TabItem item in tabControl.Items) 
{ 
    MessageBox.Show(item.Name.ToString()); 
} 

これまでのところ、このすべてが素晴らしい作品。しかし、今私はWebSocketsを介して自分のタブにアクセスしようとしています。基本的には、エンドユーザーがタブ名を入力できるようにし、そのタブが存在する場合は、そのタブのUserControlでgetTabDataなどの関数を実行します。

ただ、基本的なテストのために、私は私のWebSocketに上記foreachを移動:

var sockets = new List<Fleck.IWebSocketConnection>(); 
var websock = new Fleck.WebSocketServer("ws://0.0.0.0:58341"); 
websock.Start(socket => 
{ 
    socket.OnOpen =() => sockets.Add(socket); 
    socket.OnClose =() => sockets.Remove(socket); 
    socket.OnMessage = message => 
    { 
     sockets.ToList().ForEach(s => s.Send("Echo: " + message)); 
     foreach (TabItem item in tabControl.Items) 
     { 
      MessageBox.Show(item.Name.ToString()); 
     } 
    }; 
}); 

残念ながら、MessageBox関数だけで、各タブの名前がnullであるように思わとして完全に失敗しているようです。タブコントロール内のタブの数はわかっていますが、タブの名前やタブの内容を取得できないようです。これをどうすれば解決できますか?

のWebSocketはMainWindow.csである、とTabControlのは、あなたがUIコントロールのクロススレッドにアクセスしているMainWindow.xaml

+0

あなたのウェブソケットはどこですか?あなたはxamlのコントロールであなたを見せてくれますか?メッセージが送信されたかどうか確認しましたか?あなたのtabControlがあなたのonMessage治療を記入しているかどうかチェックしましたか?あなたのtabControlはどこで初期化されていますか? – Safe

+0

まず、任意のスレッドからUIオブジェクトにアクセスするように注意する必要があります(できません! 'socket.OnMessage'がどのスレッドを使用しているのか分かりません。また、タブの初期化と最初のメッセージの到着の間の競合状態になる可能性があります。 'Dispatcher'が何をよりよく研究しているのかわからない場合は... https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher%28v=vs.110%29.aspx ?f = 255&MSPPError = -2147217396 –

+0

OPの詳細を更新しました。 websocketは私のメッセージを正しく返信していますが、 'item.Name'がヌルであるためメッセージボックスをポップアップしません。 –

答えて

1

です。 Dispatcher.Invoke

 foreach (TabItem item in tabControl.Items) 
     { 
      MessageBox.Show(Dispatcher.Invoke(() => item.Name)); 
     } 
+0

これは完璧に機能しました!今私はUserControlから関数を実行する方法を理解する必要があります。私はあなたの頭を拾うPMあなたは気になりますか? –

+0

@JasonAxelrod、確かに!今日のミーティングでは、少しでも、できるだけ早くあなたに戻ってきます。 :) – CoolBots

+0

hah ...私はスタックオーバーフローでPMにする方法を知っているとは思わない... –

関連する問題