前几天,一个朋友让我帮他实现一个应用,在一个审批环节中,要求多人参与,通过网络对图纸进行讨论:
我用Silverlight做了一个DEOM,先看一下效果:
1.多个用户登录后,会看到同一图纸,并可选用不同颜色,粗细的笔在图纸上进行圈点,批注,
2.当一个用户在图纸上进行圈点,批注时,其他加载该图纸的用户会即时看到圈点,批注的内容
3.多个用户可同时在图纸上进行圈点,批注
4.每个用户可清除自已的圈点,批注
Silverlight中提供了InkPresenter 用来显示Stroke的手写数据,但Silverlight并没有像WPF那样提供InkCanvas用以捕获用户的手写输入.
以下代码实现捕获用户的手写输入,控制画笔颜色,粗细,并将手写数据显示的功能
System.Windows.Ink.Stroke myStroke; Color myColor; double wh = 2; private void myIP_MouseLeftButtonDown(object sender, MouseEventArgs e) { myIP.CaptureMouse(); StylusPointCollection MyStylusPointCollection = new StylusPointCollection(); MyStylusPointCollection.Add(e.StylusDevice.GetStylusPoints(myIP));
myStroke = new System.Windows.Ink.Stroke(MyStylusPointCollection); myTag.SetuserName(myStroke, username.Text);
myStroke.DrawingAttributes = new System.Windows.Ink.DrawingAttributes();
myStroke.DrawingAttributes.Color = myColor; myStroke.DrawingAttributes.Width = wh; myStroke.DrawingAttributes.Height = wh; myIP.Strokes.Add(myStroke); }
private void myIP_MouseMove(object sender, MouseEventArgs e) { if (myStroke != null) { myStroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(myIP)); } }
private void myIP_LostMouseCapture(object sender, MouseEventArgs e) { myStroke = null; save(); } |
这种应用的通讯有两种方案,
一种是点对点,没的服务器,所的客户端之间直接通讯,这种方式有点象对讲机的工作原理.
另一种是[客户端-服务器-客户端]方式,客户端之间的通讯都通过服务器进行,这种方式有点象手机的工作原理.本例使用这种方式
业务要求通讯双向进行,所以本例使用的是客户端定时向服务器询问更新的方式
由于需求要求:
而Stroke本身并没的记录这些信息的属性,所以要对其进行扩展,
在Silverlight中,许多组件都不允许继承,所以我使用附加属性对Stroke进行扩展
下面是附加属性的代码
public class myTag : DependencyObject { public static readonly DependencyProperty userNameProperty = DependencyProperty.RegisterAttached("userName", typeof(string),typeof(myTag), new PropertyMetadata("")); public static void SetuserName(DependencyObject element, string value) { element.SetValue(userNameProperty, value); } public static string GetuserName(DependencyObject element) { return (string)element.GetValue(userNameProperty); } } |
其它的看代码吧
例子下载: http://files.cnblogs.com/wxwinter/SilverlightApplication2.rar