在做设备控制的时候,比较麻烦的是连接到矩阵输出端上的设备(比如:投影机,显示器)的信号显示问题,
下面说下我用的方法:
首先建个接口:
public interface IUseVideoMatrix {
bool UseVideoOutput( int output);
void BindVideoSignal( int input, int output);
}
UseVideoOutput用于判断设备是否连到矩阵的输出端output,如果返回true,则通过BindVideoSignal将矩阵对应的
输入端input绑定给此设备。
每个连到矩阵输出端的设备对应的UserControl继承此接口,比如Odin设备的每个输入端接在矩阵的输出端上,
下图为Odin的界面:
Odin设备对应的UserControl如下:
public partial class OdinPanel : UserControl, IUseVideoMatrix {
public OdinPanel() {
InitializeComponent();
Register();
}
private void Register() {
VideoOutput2Label.Add( 1 , label1); // 1表示矩阵的输出端1
VideoOutput2Label.Add( 2 , label2);
VideoOutput2Label.Add( 3 , label3);
VideoOutput2Label.Add( 4 , label4);
VideoOutput2Label.Add( 5 , label5);
VideoOutput2Label.Add( 6 , label6);
VideoOutput2Label.Add( 7 , label7);
VideoOutput2Label.Add( 8 , label8);
}
public bool UseVideoOutput( int output) {
return VideoOutput2Label.ContainsKey(output);
}
public void BindVideoSignal( int input, int output) {
if (input < 0 || input > Room.Instance.VideoMatrix.VideoInputNames.Count) { return ; }
Label label = VideoOutput2Label[output];
label.Text = Room.Instance.VideoMatrix.GetInputNameByInput(input);
}
private Dictionary < int , Label > VideoOutput2Label = new Dictionary < int , Label > ();
}
此UserControl继承并实现了IUseVideoMatrix。
在管理类里建个IUseVideoMatrix的列表,并将继承此接口的UserControl添加到列表中,如下:
public void InstallUseMatrixPanel() {
UseVideoMatrixPanels.Add(odinPanel1);
UseVideoMatrixPanels.Add(recordPanel1);
UseVideoMatrixPanels.Add(voicePanel1);
UseVideoMatrixPanels.Add(multiplierPanel1);
}
private List < IUseVideoMatrix > UseVideoMatrixPanels = new List < IUseVideoMatrix > ();
在收到矩阵切换的命令时,遍列此列表,如果UseVideoOutput返回true,则调用BindVideoSignal刷新设备对应的信号,
代码如下:
private void VideoMatrixNotifyHandler(Notify notify) {
VideoMatrixNotify videoMatrixNotify = notify as VideoMatrixNotify;
int input = videoMatrixNotify.Input;
int output = videoMatrixNotify.Output;
foreach (var each in UseVideoMatrixPanels) {
if (each.UseVideoOutput(output)) {
each.BindVideoSignal(input, output);
}
}
}