我对C#非常不识字。我主要用脚本语言写作。拜托我。
我的应用程序中有一个TabControl。此TabControl上的TabItems是根据用户的输入以编程方式添加的。每个TabItem的内容是UserControl。我有一大堆UserControls。为简化起见,这就是我向TabControl添加TabItem的方法:
TabItem tab = new TabItem();
tab.Name = "myTab";
tab.Header = "My Tab";
switch (type)
{
case "type1": tab.Content = new MyTab1(); break;
case "type2": tab.Content = new MyTab2(); break;
case "type3": tab.Content = new MyTab3(); break;
}
tabControl.Items.Add(tab);
每个TabItem都会构建自己的信息。以下是其中一个UserControls的示例:
public partial class MyTab1 : UserControl
{
public MyTab1()
{
InitializeComponent();
}
public string getInfo()
{
return "this is a test of MyTab1 info";
}
}
我希望能够通过WebSocket服务器轮询每个选项卡以获取该信息。基本上,用户提交选项卡的名称;然后,系统应该回显出该UserControl的getInfo()
的结果。
到目前为止我已经走了多远......
Generic.sockets = new List<Fleck.IWebSocketConnection>();
Generic.websock = new Fleck.WebSocketServer("ws://0.0.0.0:58341");
Generic.websock.Start(socket =>
{
socket.OnOpen = () => Generic.sockets.Add(socket);
socket.OnClose = () => Generic.sockets.Remove(socket);
socket.OnMessage = message =>
{
foreach (TabItem item in tabControl.Items)
{
if (Dispatcher.Invoke(() => item.Name) == message)
{
// this is where I need to echo out the getInfo() function
MessageBox.Show(?????);
}
}
};
});
答案 0 :(得分:1)
您可以使用impl Trait
方法将Content
TabItem
投射到您的类型中:
getInfo()
由于socket.OnMessage = message =>
{
Dispatcher.Invoke(() =>
{
foreach (TabItem item in tabControl.Items)
{
if (item.Name == message)
{
MyTab1 tab1 = item.Content as MyTab1;
if(tab1 != null)
MessageBox.Show(tab1.getInfo());
}
}
});
};
属性可能会返回Content
,MyTab1
或MyTab2
,您需要将MyTab3
方法移至公共基类所有这些类型或定义他们都实现的接口或找到一种方法将名称映射到特定类型,以便您实际知道要转换为什么类型。
答案 1 :(得分:1)
这是学习接口的好机会,它将告诉编译器每个自定义用户控件都支持getInfo()方法。如果所有控件都实现了相同的界面,那么您不必担心要处理的对象类型。
首先定义一个这样的界面:
public interface IGetInfo
{
string getInfo();
}
接下来,每个用户控件都需要在其声明中实现该接口:
public partial class MyTab1 : UserControl, IGetInfo
{
...
}
最后,当调用getInfo()时,只需将对象转换为共享接口(IGetInfo)并正常调用getInfo():
foreach (TabItem item in tabControl.Items)
{
if (Dispatcher.Invoke(() => item.Name) == message)
((IGetInfo)item.Content).getInfo();
}