本章包括两部分内容,一个是在活动类上拖拽鼠标自动生成规则,另一个是网友的反馈,就是规则的端点不要在活动的中心,而要在活动的边缘。
五 美化
5.9 使用鼠标拖拽自动生成规则
本章内容将给系统增加一个非常好的用户体验功能。之前我们增加一个设置一个规则需要以下几个步骤:
l 点击 增加规则 按钮,添加一个规则到容器中。
l 拖动规则的起始部分,关联的一个活动。
l 拖动规则的结尾部分,关联到一个活动。
虽然只需要动动鼠标,已经很简单了,但是还有没有更简单的呢? 当然有,当鼠标在活动的中心区按下,并拖动鼠标,那么会自动生成一个临时规则,这个规则的开始活动自动关联到刚才点击的活动,临时规则的结尾点随鼠标移动,这个过程用下图来说明:
接下来来看一下为了完成以上功能需要做的工作有哪些。
1. 需要在活动上定出一个中心区域
在活动的xaml文件中增加一个圆形图,以规则的中心为中心点,为了看的清楚,这个中心区域使用黄色填充,透明度设为0.3。
2. 监控中心区域的MouseLeftButtonDown事件
当鼠标在中心区域按下时,自动生成一个临时的规则,并将这个规则的起始活动设为当前活动,把这个规则传递给第三步中的全局临时规则,代码如下:
if (_container.CurrentTemporaryRule == null)
{
_container.CurrentTemporaryRule = new Rule(_container);
_container.CurrentTemporaryRule.IsTemporaryRule = true;
_container.AddRule(_container.CurrentTemporaryRule);
_container.CurrentTemporaryRule.SetBeginActivity(this);
_container.CurrentTemporaryRule.EndPointPosition = _container.CurrentTemporaryRule.BeginPointPosition;
_container.CurrentTemporaryRule.ZIndex = _container.NextMaxIndex;
}
1. 在容器类中设置一个全局的临时规则对象
为了能够在容器的层面捕获这个自动生成的临时规则,需要定义一个容器层面的规则引用。public Rule CurrentTemporaryRule { get; set; }
2. 监控容器的MouseMove和MouseLeftButtonUp
当鼠标在容器上移动时,如果有临时的规则类,那么设置规则的结束位置,代码如下 :
private void Container_MouseMove(object sender, MouseEventArgs e)
{
if (CurrentTemporaryRule != null)
{
CurrentTemporaryRule.CaptureMouse();
CurrentTemporaryRule.EndPointPosition = e.GetPosition(CurrentTemporaryRule);
}
}
当放开鼠标时,如果有临时规则,那么检查规则的结束位置是否关联到活动,如果没有关联到任何活动,那么删除这个临时规则, 如果有关联到其他的活动,那么取消临时定义。代码如下:
private void Container_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (CurrentTemporaryRule != null)
{
CurrentTemporaryRule.SimulateRulePointMouseLeftButtonUpEvent(RuleMoveType.End, CurrentTemporaryRule, e);
if (CurrentTemporaryRule.EndActivity == null)
{
this.RemoveRule(CurrentTemporaryRule);
}
else
{
CurrentTemporaryRule.IsTemporaryRule = false;
}
CurrentTemporaryRule.ReleaseMouseCapture();
CurrentTemporaryRule = null;
}
}
通过以上的工作,我们就实现了本文开头所说的部分。
5.10 设置规则的端点在活动的边缘
这个设置可以用下图来说明。
对于规则的短线设置在活动的边缘,有两种方式可以考虑。
l 一种是找到规则和活动的相交的点(Point),如上图中红色圆圈部分所示
l 另一个是规则出现的活动的固定的点上,如上图蓝色十字相交部分所示
对于第一种情况,目前还没有找到一个好的方法来定位这个相交点。
对于第二种情况就稍微好处理一点了。
我们只要处理两个活动的中心点的相对位置, 就可以设置规则的端点的位置,如下图所示
另外当规则为曲线时,程序还需要进一步判断,下一章里面将作进一步改进。