私は、これはスコープの問題であると仮定...しかし、私は、私は助けを必要として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
あなたのウェブソケットはどこですか?あなたはxamlのコントロールであなたを見せてくれますか?メッセージが送信されたかどうか確認しましたか?あなたのtabControlがあなたのonMessage治療を記入しているかどうかチェックしましたか?あなたのtabControlはどこで初期化されていますか? – Safe
まず、任意のスレッドからUIオブジェクトにアクセスするように注意する必要があります(できません! 'socket.OnMessage'がどのスレッドを使用しているのか分かりません。また、タブの初期化と最初のメッセージの到着の間の競合状態になる可能性があります。 'Dispatcher'が何をよりよく研究しているのかわからない場合は... https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher%28v=vs.110%29.aspx ?f = 255&MSPPError = -2147217396 –
OPの詳細を更新しました。 websocketは私のメッセージを正しく返信していますが、 'item.Name'がヌルであるためメッセージボックスをポップアップしません。 –