好的,所以现在当我点击网格时,它会经过网格上的所有“路径”并检查它们是否是椭圆形,如果鼠标位于它们之上,如果选择了2个,则计算距离除了....但如果我在网格上得到50分以上,点击一个点什么都没做....有没有更有效的方法这样做?
这是我的代码:
foreach (var x in GraphPanel.Children)
{
try
{
if (((Path)x).IsMouseOver && ((Path)x).Data.ToString() == "System.Windows.Media.EllipseGeometry")
{
listViewPoints.SelectedItems.Add(listViewPoints.Items[PointIndex]);
var converter = new System.Windows.Media.BrushConverter();
var brush = (System.Windows.Media.Brush)converter.ConvertFromString("#FFB1D100");
((Path)x).Stroke = brush;
((Path)x).StrokeThickness = 8;
if (listViewPoints.SelectedItems.Count == 2)
{
double diffX;
double diffY;
double ptAX = ((Points)listViewPoints.SelectedItems[0]).A;
double ptAY = ((Points)listViewPoints.SelectedItems[0]).B;
double ptBX = ((Points)listViewPoints.SelectedItems[1]).A;
double ptBY = ((Points)listViewPoints.SelectedItems[1]).B;
if (ptAX > ptBX)
{
diffX = ptAX - ptBX;
}
else
{
diffX = ptBX - ptAX;
}
if (ptAY > ptBY)
{
diffY = ptAY - ptBY;
}
else
{
diffY = ptBY - ptAY;
}
//the distance between the points = sqr/-diff in x squared + diff in y squared
double result = Math.Sqrt(Math.Pow(diffX,2) + Math.Pow(diffY,2));
CalculatedDistanceApart.Content = "Distance Apart: " + result.ToString() + "'";
}
}
if (((Path)x).Data.ToString() == "System.Windows.Media.EllipseGeometry")
{
PointIndex++;
}
}
catch { }
}
答案 0 :(得分:2)
您可以向网格添加省略号,而不是使用路径,只需将MouseLeftButtonUp事件处理程序附加到每个椭圆。
您不需要所有这些命中测试代码。
答案 1 :(得分:1)
好吧,我不知道你的慢IsMouseOver
,但整个事情当然可以加速和整理:
//why make these for every item?
var converter = new System.Windows.Media.BrushConverter();
var brush = (System.Windows.Media.Brush)converter.ConvertFromString("#FFB1D100");
foreach (var x in GraphPanel.Children)
{
//this is tidier, but what if it's not a Path, is that possible?
var path = (Path)x;
//jump out here if it's not the right type, reduces nesting and removes one comparison
if(!(path.Data is System.Windows.Media.EllipseGeometry)) continue;
try
{
if (path.IsMouseOver)
{
listViewPoints.SelectedItems.Add(listViewPoints.Items[PointIndex]);
path.Stroke = brush;
path.StrokeThickness = 8;
if (listViewPoints.SelectedItems.Count == 2)
{
double ptAX = ((Points)listViewPoints.SelectedItems[0]).A;
double ptAY = ((Points)listViewPoints.SelectedItems[0]).B;
double ptBX = ((Points)listViewPoints.SelectedItems[1]).A;
double ptBY = ((Points)listViewPoints.SelectedItems[1]).B;
//you're going to square these, so negatives don't matter
double diffX = ptAX - ptBX;
double diffY = ptAY - ptBY;
//the distance between the points = sqr/-diff in x squared + diff in y squared
//don't use Math.Pow for squaring
double result = Math.Sqrt(diffX*diffX + diffY*diffY);
CalculatedDistanceApart.Content = "Distance Apart: " + result + "'";
//are we done now?
}
}
PointIndex++;
}
catch { }
}