public override void OnDrawing(IModel sender, PointerPoint args) { var f = args.Properties.Pressure; var s = size_prs ? Math.Max(size * size_min, size * f) : size; var d = density_prs ? Math.Max(density * density_min, density * f) : density; var b = blend_prs ? Math.Max(blend * blend_min, blend * (1 - f)) : blend; var layer = sender.CurrentLayer; var pr = new Rect((p.x - s), (p.y - s), (s * 2) + 2, (s * 2) + 2); if (!merge && orec != RectHelper.Union(orec, pr)) { merge = true; } p = new Point(-layer.X + args.Position.X, -layer.Y + args.Position.Y);// getPosition(e); rect = RectHelper.Intersect(RectHelper.Union(rect, pr), DrawRect); if (Vec2.testLen(p2, p, s * Graphics.Step)) { //gdi.DrawBerzier(p2, p1, p); gdi.DrawBerzier(p2, p1, p, s, hard, opacity, d, b, dilution); p2 = p1; p1 = p; } // View.DrawPanel.rec.setRect(rect); }
/// <summary> /// 获得最上面的相交对象 /// </summary> /// <param name="p_rect"></param> /// <returns></returns> internal SNode GetFirstIntersect(Rect p_rect) { return((from obj in _container.Children let item = obj as SNode where item != null && RectHelper.Intersect(new Rect(Canvas.GetLeft(item), Canvas.GetTop(item), item.ActualWidth, item.ActualHeight), p_rect) != RectHelper.Empty orderby Canvas.GetZIndex(item) descending select item).FirstOrDefault <SNode>()); }
public override async void OnDrawCommit(IModel sender, PointerPoint args) { base.OnDrawCommit(sender, args); var area = sender.ElemArea as Border; if (area.Child == null) { return; } VModel.vm.Loading = true; var rb = await(area.Child as FrameworkElement).Render(); do { if (rb == null) { break; } sender.CurrentLayer.getRect(out Rect or, out WriteableBitmap ob); var layer = sender.CurrentLayer; var pos = (area.Child as FrameworkElement).RenderTransform as TranslateTransform; var rect = new Rect(pos.X, pos.Y, rb.PixelWidth, rb.PixelHeight); var nr = RectHelper.Intersect(or.IsEmpty ? rect : RectHelper.Union(rect, or), DrawRect); if (nr.IsEmpty) { break; } var i = sender.Layers.IndexOf(layer); var b = sender.CurrentLayer.Bitmap.Clone(); var nb = new WriteableBitmap((int)Math.Ceiling(nr.Width), (int)Math.Ceiling(nr.Height)); IGrap.addImg(b, nb, -(int)Math.Floor(nr.X - or.Left), -(int)Math.Floor(nr.Y - or.Top)); IGrap.addImg(rb, nb, -(int)Math.Floor(nr.X - rect.X), -(int)Math.Floor(nr.Y - rect.Y)); Exec.Do(new Exec() { exec = () => { sender.Layers[i].setRect(nr, nb); }, undo = () => { sender.Layers[i].setRect(or, ob); sender.CurrentLayer = sender.Layers[i]; } }); } while (false); VModel.vm.Loading = false; sender.ElemArea.Child = null; }
public static bool IsVisibleOnContainer(this FrameworkElement Element, FrameworkElement Container) { if (Element == null || Container == null) { return(false); } Rect ElementBounds = Element.TransformToVisual(Container).TransformBounds(new Rect(0.0, 0.0, Element.ActualWidth, Element.ActualHeight)); Rect ContainerBounds = new Rect(0.0, 0.0, Container.ActualWidth, Container.ActualHeight); return(!RectHelper.Intersect(ContainerBounds, ElementBounds).IsEmpty); }
async Task Render(IModel sender, FrameworkElement child) { if (child == null) { return; } var rb = await child.Render(); if (rb == null) { return; } var layer = sender.CurrentLayer; var pos = child.RenderTransform as TranslateTransform; var rect = new Rect(pos.X, pos.Y, rb.PixelWidth, rb.PixelHeight); var or = orect; var nr = RectHelper.Intersect(rect, DrawRect); if (nr.IsEmpty) { return; } var i = sender.Layers.IndexOf(layer); var b = sender.CurrentLayer.Bitmap.Clone(); var nt = (child as TextBlock).Text + "\t" + Size + "\t" + FontName; var ot = otxt; var nb = new WriteableBitmap((int)Math.Ceiling(nr.Width), (int)Math.Ceiling(nr.Height)); var ob = obmp; // IGrap.addImg(b, nb, -(int)Math.Floor(nr.X - or.Left), -(int)Math.Floor(nr.Y - or.Top)); IGrap.addImg(rb, nb, -(int)Math.Floor(nr.X - rect.X), -(int)Math.Floor(nr.Y - rect.Y)); sender.ElemArea.Child = null; Exec.Do(new Exec() { exec = () => { sender.Layers[i].setRect(nr, nb); sender.Layers[i].Name = nt; sender.CurrentLayer = sender.Layers[i]; }, undo = () => { sender.Layers[i].setRect(or, ob); sender.Layers[i].Name = ot; sender.CurrentLayer = sender.Layers[i]; } }); }
/// <summary> /// 判定传入的区域是否在sketch的对象的有效区域 /// </summary> /// <param name="p_rect"></param> /// <returns></returns> internal bool IsValidRegion(Rect p_rect) { foreach (object obj in _container.Children) { var item = obj as FrameworkElement; if (item != null && !(item is SLine)) { Rect itemRect = new Rect(Canvas.GetLeft(item), Canvas.GetTop(item), item.ActualWidth, item.ActualHeight); if (RectHelper.Intersect(itemRect, p_rect) != RectHelper.Empty) { return(true); } } } return(false); }
private void Tick(object sender, object e) { counter = (counter + 1) % 8; Stickman.Source = images[counter]; speed += 1; stickR.Y = Math.Min(200, stickR.Y + speed); Stickman.SetValue(Canvas.TopProperty, stickR.Y); boxR.X = (boxR.X > -100) ? boxR.X - 10 : 600; Box.SetValue(Canvas.LeftProperty, boxR.X); if (RectHelper.Intersect(boxR, stickR) != Rect.Empty) { GameOver.Visibility = Visibility.Visible; timer.Stop(); } }
public bool CheckMatrix(Matrix?m = null) { if (!m.HasValue) { m = (CANVAS.RenderTransform as MatrixTransform).Matrix; } var ccc = new RectangleGeometry(); ccc.Rect = DrawRect; ccc.Transform = new MatrixTransform() { Matrix = m.Value }; var size = DesiredSize; var rect = new Rect( size.Width * .1, size.Height * .1, size.Width * .8, size.Height * .8 ); return(!RectHelper.Intersect(ccc.Bounds, rect).IsEmpty); }
public ICanvasImage Apply(ICanvasImage image, ref Rect?bounds) { if (!IsEnabled) { return(image); } var metadata = EffectMetadata.Get(type); // Instantiate the effect. var effect = (ICanvasImage)Activator.CreateInstance(metadata.ImplementationType); // Set the effect input. SetProperty(effect, "Source", image); // Set configurable parameter values. foreach (var parameter in metadata.Parameters) { var value = GetParameter(parameter); SetProperty(effect, parameter.Name, value); // Track the image bounds if cropping changes them. if (this.Type == EffectType.Crop && parameter.Name == "SourceRectangle") { bounds = bounds.HasValue ? RectHelper.Intersect(bounds.Value, (Rect)value) : (Rect)value; } } // Set any constant values. foreach (var constant in metadata.Constants) { SetProperty(effect, constant.Key, constant.Value); } return(effect); }
public static Rect Clamp(this Rect source, [NotNull] FrameworkElement element) { return(RectHelper.Intersect(LayoutInformation.GetLayoutSlot(element), source)); }
public override async void OnDrawCommit(IModel sender, PointerPoint args) { if (rect.IsEmpty) { OnDrawRollback(sender, args); return; } var layer = sender.CurrentLayer; if (Clipper.IsCliping) { //sender.X.Source = bmp; VModel.vm.Loading = true; var bmp = await layer.Child.Render(); VModel.vm.Loading = false; var pos = (Point)layer.Child.Tag; IGrap.addImg(bmp, layer.Bitmap, (int)Math.Round(pos.X), (int)Math.Round(pos.Y)); layer.Child = null; } if (merge) { var or = orec; var ob = obmp; var nr = RectHelper.Intersect(RectHelper.Union(rect, orec), DrawRect); var i = sender.Layers.IndexOf(layer); var nb = IGrap.clipImg(layer.Bitmap, nr); Exec.Do(new Exec() { exec = () => { sender.Layers[i].setRect(nr, nb); }, undo = () => { sender.Layers[i].setRect(or, ob); sender.CurrentLayer = sender.Layers[i]; } }); } else { var or = orec; var nr = rect; var nb = IGrap.clipImg(layer.Bitmap, nr); layer.setRect(orec, obmp); nr.X -= or.X; nr.Y -= or.Y; var ob = IGrap.clipImg(obmp, nr); var i = sender.Layers.IndexOf(layer); Exec.Do(new Exec() { exec = () => { layer = sender.Layers[i]; IGrap.copyImg(nb, layer.Bitmap, (int)Math.Floor(nr.X), (int)Math.Floor(nr.Y)); layer.Bitmap.Invalidate(); }, undo = () => { layer = sender.Layers[i]; IGrap.copyImg(ob, layer.Bitmap, (int)Math.Floor(nr.X), (int)Math.Floor(nr.Y)); layer.Bitmap.Invalidate(); sender.CurrentLayer = sender.Layers[i]; } }); } }
private void Game_timer_movement_Tick(object sender, object e) { bool hitRemoved = true; bool bulletGotHit = true; double remainHP; if (enemy_Control.Count() == 0) // if these is no enemies - we level up because he killed all the enemies { //stop clocks enemy_create_bullet_timer.Stop(); // stop creating bullets for enemies because there are no more enemies. game_timer_movement.Stop(); // stop the game timer - to not check LevelUpMessageAsync(Level.Currentlevel); //now depends on the option he choose } else // move enemys { for (int i = 0; i < enemy_Control.Count(); i++) // move the the enemies { enemy_Control[i].Move(); } } if (bullet_Control.Count() != 0) // bullets from player - check for hit with enemys and remove them: //if we have bullets we run on both lists , the first loop runs on each bullet and then each bullet, { //runs in second loop that checks the other enemies. we check for collusion and then move for (int player_bullet = 0; player_bullet < bullet_Control.Count(); player_bullet++) //move on each bullet { hitRemoved = true; Rect enemyRectangle; Rect bulletRectangle = new Rect(bullet_Control[player_bullet].getBulletInfo()[0], bullet_Control[player_bullet].getBulletInfo()[1], bullet_Control[player_bullet].getBulletInfo()[2], bullet_Control[player_bullet].getBulletInfo()[3]); // we create a rectangle for the bullet and then we create a rectangle for each enemy and check if they were hit for (int enemy = 0; enemy < this.enemy_Control.Count(); enemy++) { enemyRectangle = new Rect(enemy_Control[enemy].getPlayerLocation()[0], enemy_Control[enemy].getPlayerLocation()[1], enemy_Control[enemy].GetWidth(), enemy_Control[enemy].GetHeight()); Rect r = RectHelper.Intersect(bulletRectangle, enemyRectangle); if (r.Width > 0 || r.Height > 0) // if there is collusion { //bullet control - i , enemy control - j if (bullet_Control[player_bullet].damage > enemy_Control[enemy].hitPoints) // if the damage of the bullet is larger than the hitpoints - enemy dies here - getting coins { bullet_Control[player_bullet].damage -= enemy_Control[enemy].hitPoints; //remove damage as much as hp canvas.Children.Remove(enemy_Control[enemy].GetImage()); // remove enemy from list and canvas coins += (enemy_Control[enemy].enemyLevel + Level.Currentlevel); // add coins - by enemy and then remove enemy Coins_Text.Text = coins.ToString(); enemy_Control.Remove(enemy_Control[enemy]); // the bullet continues to the next enemy that he gets //explode enemy animation MoveBullet(bullet_Control[player_bullet]); // we move the bullet only if possible } else if (bullet_Control[player_bullet].damage < enemy_Control[enemy].hitPoints) // if the damage of the bullet is less than the enemy hp { enemy_Control[enemy].hitPoints -= bullet_Control[player_bullet].damage; // remove hp as much dmg canvas.Children.Remove(bullet_Control[player_bullet].GetBulletImage()); // remove bullet from canvas and from list bullet_Control.Remove(bullet_Control[player_bullet]); hitRemoved = false; break; // if the bullet is already removed from the list there is no need to check we all the enemies for to continue move to next bullet and not enemy //explode animation } else if (bullet_Control[player_bullet].damage == enemy_Control[enemy].hitPoints) // enemy dies here - getting coins { ////explode animation remove bullet and enemy from lists and canvas canvas.Children.Remove(bullet_Control[player_bullet].GetBulletImage()); bullet_Control.Remove(bullet_Control[player_bullet]); canvas.Children.Remove(enemy_Control[enemy].GetImage()); coins += (enemy_Control[enemy].enemyLevel + Level.Currentlevel); // add coins and then remove enemy Coins_Text.Text = coins.ToString(); enemy_Control.Remove(enemy_Control[enemy]); hitRemoved = false; break; // if the bullet is already removed from the list there is no need to check with all the enemies for to continue } } } if (hitRemoved) // After moving on all the enemies, move ,if hit and removed, doesnt move. for each bullet { MoveBullet(bullet_Control[player_bullet]); // moves if hits and bigger dmg than hp or didnt hit at all } } } for (int bullet = 0; bullet < enemy_bullet_control.Count(); bullet++) // - for each bullet i - per bullet - move on each bullet of the enemy { bulletGotHit = false; Rect r; Rect enemybulletRect = new Rect(enemy_bullet_control[bullet].getBulletInfo()[0], enemy_bullet_control[bullet].getBulletInfo()[1], enemy_bullet_control[bullet].getBulletInfo()[2], enemy_bullet_control[bullet].getBulletInfo()[3]); //check hit with shield - enemybullet -> shield for (int shield = 0; shield < ShieldRectangles.Count(); shield++) // j - per shield - create a rect for each bullet and move on the shield that were already made { if (ShieldHp[shield] == 0) // if we have a shield that doesnt exist, we just continue to the next shield { continue; } r = RectHelper.Intersect(enemybulletRect, ShieldRectangles[shield]); if (r.Width > 20 || r.Height > 20) //if they were hit { canvas.Children.Remove(enemy_bullet_control[bullet].GetBulletImage()); // remove from the bullet from the canavas first remainHP = ShieldHp[shield] - enemy_bullet_control[bullet].damage; // take how much hp remained to calculate which image to preview //if the hp updates - we update on the canvas, the lists of images shield and list of images hp UpdateShieldHpImage(remainHP, shield, bullet); enemy_bullet_control.Remove(enemy_bullet_control[bullet]); // at the end remove bullet bulletGotHit = true; // mark they were hit and bullet doesnt need to move //Debug.WriteLine("Shield-" + (j + 1) + " hp-" + ShieldHp[j]); } } // check hit with player - enemy bullet -> player //create rect for player - player moves so rect is changing Rect playerRect = new Rect(player.getPlayerLocation()[0], player.getPlayerLocation()[1], player.GetWidth(), player.GetHeight()); r = RectHelper.Intersect(enemybulletRect, playerRect); // check for hit between bullet of enemy and player if (r.Width > 20 || r.Height > 20) // if they were hit { canvas.Children.Remove(enemy_bullet_control[bullet].GetBulletImage()); // remove from the bullet from the canavas first Player_HitPoints -= enemy_bullet_control[bullet].damage; // reduce hp Health_Text.Text = "Health: " + Player_HitPoints.ToString() + '%'; // update text box enemy_bullet_control.Remove(enemy_bullet_control[bullet]); // remove bullet from the list bulletGotHit = true; // bullet got hit so he doesnt move if (Player_HitPoints <= 0) // player lose { enemy_create_bullet_timer.Stop(); // stop creating bullets for enemies because he lost game_timer_movement.Stop(); // stop the game timer - to not check PlayerLostAsync(); Frame.Navigate(typeof(MainPage)); // back to start //like the level up - same thing here but exit } } if (!bulletGotHit) { MoveBullet(enemy_bullet_control[bullet]); } } }
public bool IsVisible(Rect viewPort) { IsActive = RectHelper.Intersect(viewPort, Bounds) != Rect.Empty; return(IsActive); }
/// <summary> /// Update the scene based on inputs /// </summary> /// <param name="dt"> A delta time since the last update was called </param> /// <param name="input"> Generic input </param> public override void Update(TimeSpan dt, GenericInput input) { if (mp.PlaybackSession.PlaybackState != MediaPlaybackState.Playing) { mp.PlaybackSession.Position = TimeSpan.Zero; mp.Play(); } foreach (Hero hero in heros) { //update each generic item hero.Update(dt, input); } foreach (Villain villain in villains) { villain.Update(dt, input); //reset the bosses hit image to default image after 300ms of no hits if (villain is Boss) { villain.TimeSinceCollision = DateTime.Now - villain.LastCollision; if (villain.TimeSinceCollision.TotalMilliseconds > 300 && villain.HurtImage) { villain.SetBitmapFromImageDictionary("Boss"); } } //update the hero's location to each villain foreach (Hero hero in heros) { villain.HeroLocation = hero.Location; } } foreach (GenericItem gi in objects) { //update each generic item gi.Update(dt, input); //find out if any of the attacks hit the villains or hero if (gi is Attack) { Attack attack = (Attack)gi; switch (attack.Type) { case (Attack.AttackType.Hero_Arrow): { foreach (Villain villain in villains) { if (RectHelper.Intersect(villain.BoundingRectangle, gi.BoundingRectangle) != Rect.Empty) { villain.TimeSinceCollision = DateTime.Now - villain.LastCollision; if (villain.TimeSinceCollision.TotalMilliseconds > villain.iFrames) { Message_Collision villain_collision = new Message_Collision("Arrow", gi, villain); MessageManager.AddMessageItem(villain_collision); villain.LastCollision = DateTime.Now; if (villain is Boss) { villain.SetBitmapFromImageDictionary("BossHurt"); villain.HurtImage = true; } } } } break; } case (Attack.AttackType.Boss_Arrow): { foreach (Hero hero in heros) { if (RectHelper.Intersect(hero.BoundingRectangle, gi.BoundingRectangle) != Rect.Empty) { hero.TimeSinceCollision = DateTime.Now - hero.LastCollision; if (hero.TimeSinceCollision.TotalMilliseconds > hero.iFrames) { Message_Collision hero_collision = new Message_Collision("Arrow", gi, hero); MessageManager.AddMessageItem(hero_collision); hero.LastCollision = DateTime.Now; } } } break; } } } } }
public override async void OnToolState(IModel sender, bool state) { var layer = sender.CurrentLayer; if (!layer.IsEdit || !layer.IsShow) { return; } if (layer.Bitmap == null) { return; } Debug.WriteLine("state:" + state); if (state) { layer.getRect(out orec, out obb); if (Clipper.IsCliping) { VModel.vm.Loading = true; //拷贝选区 var Bitmap = new WriteableBitmap((int)DrawRect.Width, (int)DrawRect.Height); IGrap.copyImg(obb, Bitmap, (int)orec.X, (int)orec.Y); layer.Child = Clipper.createPolygon(Bitmap); var p = (Point)layer.Child.Tag; var xb = await(layer.Child.Render()); Clipper.Points.Clear(); layer.Child = null; if (xb != null) { var i = sender.Layers.IndexOf(layer); var nb = obb; var ob = obb; if (layer.Bitmap != null) { nb = layer.Bitmap.Clone(); IGrap.delImg(xb, nb, (int)(p.X - orec.X), (int)(p.Y - orec.Y)); nb.Invalidate(); } obb = xb; orec = new Rect(p.X, p.Y, xb.PixelWidth, xb.PixelHeight); Exec.Do(new Exec() { exec = () => { sender.Layers[i].Bitmap = nb; sender.Layers.Insert(i, new LayerModel() { Bitmap = xb, X = p.X, Y = p.Y }); sender.CurrentLayer = sender.Layers[i]; }, undo = () => { sender.Layers.RemoveAt(i); sender.CurrentLayer = sender.Layers[i]; sender.CurrentLayer.Bitmap = ob; } }); } VModel.vm.Loading = false; } sender.ElemArea.Child = CreateRect(sender); ch = false; } else { sender.ElemArea.Child = null; if (!ch) { return; } var vc = new CompositeTransform() { Rotation = com.Rotation, ScaleX = com.ScaleX, ScaleY = com.ScaleY, CenterX = com.TranslateX + layer.W / 2, CenterY = com.TranslateY + layer.H / 2 }; var or = orec; var ob = obb; layer.getRect(out Rect nr, out WriteableBitmap nb); if (com.ScaleX != 1 || com.ScaleY != 1 || com.Rotation != 0) { var elem = (FrameworkElement)((DrawPanel)sender).ITEMS.ContainerFromItem(layer); VModel.vm.Loading = true; var b = await(elem).Render(); VModel.vm.Loading = false; var vr = vc.TransformBounds(nr); nr = RectHelper.Intersect(DrawRect, vr); if (nr.IsEmpty) { nb = null; layer.setRect(nr, nb); } else { nb = new WriteableBitmap((int)nr.Width, (int)nr.Height); IGrap.addImg(b, nb, (int)(vr.X - nr.X), (int)(vr.Y - nr.Y)); layer.setRect(nr, nb); } com.Rotation = 0; com.ScaleX = 1; com.ScaleY = 1; } var i = sender.Layers.IndexOf(sender.CurrentLayer); Exec.Save(new Exec() { exec = () => { sender.Layers[i].setRect(nr, nb); }, undo = () => { sender.Layers[i].setRect(or, ob); } }); } }
public bool IntersectWith(Rectangle other) { var res = RectHelper.Intersect(new Windows.Foundation.Rect(this.TopX, this.TopY, this.Width, this.Height), new Windows.Foundation.Rect(other.TopX, other.TopY, other.Width, other.Height)); return(!res.IsEmpty); }
public float OverlapSize(Rectangle other) { var res = RectHelper.Intersect(new Windows.Foundation.Rect(this.TopX, this.TopY, this.Width, this.Height), new Windows.Foundation.Rect(other.TopX, other.TopY, other.Width, other.Height)); return(res.IsEmpty ? 0 : (float)(res.Width * res.Height)); }
private void View_PointerMoved(object sender, PointerRoutedEventArgs e) { if (IsEnabled && e.Pointer.PointerDeviceType == PointerDeviceType.Mouse && e.GetCurrentPoint(View).Properties.IsLeftButtonPressed) { if (Interlocked.Exchange(ref Locker, 1) == 0) { try { Point RelativeEndPoint = e.GetCurrentPoint(View).Position; SrcollIfNeed(RelativeEndPoint); Point AbsEndPoint = new Point(RelativeEndPoint.X + InnerScrollView.HorizontalOffset, RelativeEndPoint.Y + InnerScrollView.VerticalOffset); Point RelativeStartPoint = new Point(AbsStartPoint.X - InnerScrollView.HorizontalOffset, AbsStartPoint.Y - InnerScrollView.VerticalOffset); DrawRectangleInCanvas(RelativeStartPoint, RelativeEndPoint); if (Math.Abs(RelativeStartPoint.X - RelativeEndPoint.X) >= 20 && Math.Abs(RelativeStartPoint.Y - RelativeEndPoint.Y) >= 20) { List <FileSystemStorageItemBase> VisibleList = new List <FileSystemStorageItemBase>(); if (View is ListView) { ItemsStackPanel VirtualPanel = View.ItemsPanelRoot as ItemsStackPanel; for (int i = VirtualPanel.FirstVisibleIndex; i <= VirtualPanel.LastVisibleIndex; i++) { VisibleList.Add(View.Items[i] as FileSystemStorageItemBase); } } else { ItemsWrapGrid VirtualPanel = View.ItemsPanelRoot as ItemsWrapGrid; for (int i = VirtualPanel.FirstVisibleIndex; i <= VirtualPanel.LastVisibleIndex; i++) { VisibleList.Add(View.Items[i] as FileSystemStorageItemBase); } } foreach (FileSystemStorageItemBase Item in VisibleList.Except(AbsItemLocationRecord.Select((Rec) => Rec.Key))) { if (View.ContainerFromItem(Item) is SelectorItem Selector) { AbsItemLocationRecord.Add(new KeyValuePair <FileSystemStorageItemBase, Rect>(Item, Selector.TransformToVisual(View).TransformBounds(new Rect(InnerScrollView.HorizontalOffset, InnerScrollView.VerticalOffset, Selector.ActualWidth, Selector.ActualHeight)))); } } Rect AbsBoxSelectionRect = new Rect(Math.Min(AbsStartPoint.X, AbsEndPoint.X), Math.Min(AbsStartPoint.Y, AbsEndPoint.Y), Math.Abs(AbsStartPoint.X - AbsEndPoint.X), Math.Abs(AbsStartPoint.Y - AbsEndPoint.Y)); foreach (KeyValuePair <FileSystemStorageItemBase, Rect> Pair in AbsItemLocationRecord) { Rect Intersect = RectHelper.Intersect(AbsBoxSelectionRect, Pair.Value); if (!Intersect.IsEmpty && Intersect.Width > 0 && Intersect.Height > 0) { if (!View.SelectedItems.Contains(Pair.Key)) { View.SelectedItems.Add(Pair.Key); } } else { View.SelectedItems.Remove(Pair.Key); } } } } catch (Exception ex) { LogTracer.Log(ex); } finally { _ = Interlocked.Exchange(ref Locker, 0); } } } }