public VirtualSchemaContainer() { // InitializeComponent(); scroller = new ScrollViewer(); scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible; scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Visible; scroller.CanContentScroll = true; Child = scroller; grid = new VirtualCanvas(); scroller.Content = grid; grid.SmallScrollIncrement = new Size(_tileWidth + _tileMargin, _tileHeight + _tileMargin); //Scroller.Content = grid; object v = scroller.GetValue(ScrollViewer.CanContentScrollProperty); Canvas target = grid.ContentCanvas; zoom = new MapZoom(target); pan = new Pan(target, zoom); rectZoom = new RectangleSelectionGesture(target, zoom, System.Windows.Input.ModifierKeys.Control); rectZoom.ZoomSelection = true; autoScroll = new AutoScroll(target, zoom); zoom.ZoomChanged += new EventHandler(OnZoomChanged); grid.VisualsChanged += new EventHandler <VisualChangeEventArgs>(OnVisualsChanged); //ZoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(OnZoomSliderValueChanged); grid.Scale.Changed += new EventHandler(OnScaleChanged); grid.Translate.Changed += new EventHandler(OnScaleChanged); grid.Background = new SolidColorBrush(Color.FromRgb(0xd0, 0xd0, 0xd0)); grid.ContentCanvas.Background = Brushes.White; }
private void Init() { if (Document.DocumentMode == DocumentMode.Auto) { List <Node> nodes = NodeFactory.CreateNodes(30); ContentControl.PopulateNodes(nodes); LinkFactory.Nodes = nodes; ContentControl.PopulateLinks(LinkFactory.CreateLinks(60)); } Canvas target = ContentControl.ContentCanvas; zoom = new MapZoom(target); pan = new Pan(target, zoom); rectZoom = new RectangleSelectionGesture(target, zoom, ModifierKeys.Control); rectZoom.ZoomSelection = true; autoScroll = new AutoScroll(target, zoom); zoom.ZoomChanged += new EventHandler(OnZoomChanged); ContentControl.VisualsChanged += new EventHandler <VisualChangeEventArgs>(OnVisualsChanged); //ZoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(OnZoomSliderValueChanged); ContentControl.Scale.Changed += new EventHandler(OnScaleChanged); ContentControl.Translate.Changed += new EventHandler(OnScaleChanged); //ContentControl.Background = new SolidColorBrush(Color.FromRgb(0xd0, 0xd0, 0xd0)); ContentControl.Background = new SolidColorBrush(Colors.White); ContentControl.ContentCanvas.Background = Brushes.White; Document.Nodes = ContentControl.Nodes; Document.Links = ContentControl.Links; }
/// <summary> /// Construct new AutoScroll object that will scroll the given target object within it's container /// by attaching to the mouse events of the container. /// </summary> /// <param name="target">The target object to scroll</param> /// <param name="zoom">The master MapZoom object that manages the actual render transform</param> public AutoScroll(FrameworkElement target, MapZoom zoom) { _container = target.Parent as Panel; _target = target; _container.MouseDown += new MouseButtonEventHandler(OnMouseDown); _container.MouseMove += new MouseEventHandler(OnMouseMove); _container.MouseWheel += new MouseWheelEventHandler(OnMouseWheel); Keyboard.AddKeyDownHandler(_container, new KeyEventHandler(OnKeyDown)); _zoom = zoom; }
/// <summary> /// Construct new Pan gesture object. /// </summary> /// <param name="target">The target to be panned, must live inside a container Panel</param> /// <param name="zoom"></param> public Pan(FrameworkElement target, MapZoom zoom) { this._target = target; this._container = target.Parent as Panel; if (this._container == null) { // todo: localization throw new ArgumentException("Target object must live in a Panel"); } this._zoom = zoom; _container.MouseLeftButtonDown += new MouseButtonEventHandler(OnMouseLeftButtonDown); _container.MouseLeftButtonUp += new MouseButtonEventHandler(OnMouseLeftButtonUp); _container.MouseMove += new MouseEventHandler(OnMouseMove); }
public VirtualCanvasViewModel(IContainerExtension containerExtension) : base(containerExtension) { Views.VirtualCanvas canvas = new Views.VirtualCanvas(); Graph = canvas.Graph; View = canvas; Canvas target = Graph.ContentCanvas; Zoom = new MapZoom(target); Pan = new Pan(target, Zoom); AutoScroll = new AutoScroll(target, Zoom); RectZoom = new RectangleSelectionGesture(target, Zoom); }
/// <summary> /// Construct new RectangleSelectionGesture object for selecting things in the given target object. /// </summary> /// <param name="target">A FrameworkElement</param> /// <param name="zoom">The MapZoom object that wraps this same target object</param> public RectangleSelectionGesture(FrameworkElement target, MapZoom zoom, ModifierKeys mods) { _mods = mods; _target = target; _container = target.Parent as Panel; if (_container == null) { throw new ArgumentException("Target object must live in a Panel"); } _zoom = zoom; _container.MouseLeftButtonDown += new MouseButtonEventHandler(OnMouseLeftButtonDown); _container.MouseLeftButtonUp += new MouseButtonEventHandler(OnMouseLeftButtonUp); _container.MouseMove += new MouseEventHandler(OnMouseMove); }
private void InitializeComponent() { this.SuspendLayout(); // // wpfContainerHost // this._wpfSchemaContainer.Dock = System.Windows.Forms.DockStyle.Fill; this._wpfSchemaContainer.Location = new System.Drawing.Point(0, 0); this._wpfSchemaContainer.Name = "WPFSchemaContainer"; this._wpfSchemaContainer.Size = new System.Drawing.Size(292, 273); this._wpfSchemaContainer.TabIndex = 0; this._wpfSchemaContainer.Text = "WPFSchemaContainer"; this._wpfSchemaContainer.Child.KeyDown += new System.Windows.Input.KeyEventHandler(WpfKeyDown); this.XamlView = new TextBox { Dock = System.Windows.Forms.DockStyle.Bottom, Multiline = true, ScrollBars = ScrollBars.Both, Size = new System.Drawing.Size(200, 200) }; this.XamlView.Hide(); XamlView.MaxLength = int.MaxValue; // // SchemaView // this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this._wpfSchemaContainer); this.Controls.Add(XamlView); this.Name = "SchemaView"; this.ResumeLayout(false); this.UndoBuff = new BaseUndoBuffer(this); this.SelectionManager = new SchemaSelectionManager(this); _documentMenuContext = new MenuCommandContext(contextMenu); this.ContextMenuStrip = contextMenu; //CommandManager.documentMenuContext = _documentMenuContext;////???????????????????????????? this._wpfSchemaContainer.Child.AllowDrop = true; this._wpfSchemaContainer.Child.DragEnter += new System.Windows.DragEventHandler(Child_DragEnter); this._wpfSchemaContainer.Child.Drop += new System.Windows.DragEventHandler(Child_Drop); ZoomManager = new MapZoom(MainPanel); CreateCommands(); MainPanel.Loaded += new RoutedEventHandler(MainCanvas_Loaded); }
public ZoomVirtualized() { InitializeComponent(); canvas.ContentCanvas.Background = FindResource("brush") as Brush; var zoom = new MapZoom(canvas.ContentCanvas); int x = 0; int y = 200; for(int i = 0;i < 10000;i++) { var e = new Grid { Width = 100, Height = 100 ,ClipToBounds = false}; var el = new Ellipse { Fill = Brushes.Red, Stroke = Brushes.Black, StrokeThickness = 2 }; e.Children.Add(el); var t = new TextBlock { Text = i.ToString(), FontSize = 30 , ClipToBounds = false , VerticalAlignment = System.Windows.VerticalAlignment.Center, HorizontalAlignment = System.Windows.HorizontalAlignment.Center}; e.Children.Add(t); VirtualCanvas.SetX(e,x * 100); VirtualCanvas.SetY(e, Math.Sin(i) * 200 + y); e.CacheMode = new BitmapCache(); canvas.VirtualChildren.Add(e); var zoomProperty = DependencyPropertyDescriptor.FromProperty(TouchScrollViewer.ScrollViewerZoomProperty, typeof(Grid)); zoomProperty.AddValueChanged(e, new EventHandler(ZoomChanged)); e.RenderTransformOrigin = new Point(0.5,0.5); e.RenderTransform = new ScaleTransform(); //el.Loaded += e_Loaded; x++; if (i % 500 == 0) { x = 0; y += 500; } } //LayoutUpdated += ZoomTest_LayoutUpdated; scroll.ScrollChanged += scroll_ScrollChanged; }
public void nextMapZoom() { Array values = Enum.GetValues(typeof(MapZoom)); int index = Array.IndexOf(values, mapZoom); index = (index + 1) % values.Length; mapZoom = (MapZoom)values.GetValue(index); }
/// <summary> /// 计算下载任务列表 /// </summary> public void CalculateQuest() { // 先按多边形分组,一组点可能组成多个多边形 var points = m_points; //while (points.Any()) //{ // var index = points.ToList().LastIndexOf(points.First()); // if (index == 0) // { // if (points.Any()) // { // File.AppendAllLines("points.txt", points.Select(o=>$"{o.X},{o.Y}")); // } // break; // } // var region = new MercatorRegion(points.Take(index + 1)); // m_mercatorRegions.Add(region); // points = points.Skip(index + 1).ToList(); //} if (!m_mercatorRegions.Any()) { throw new ArgumentException("无法构建成多边形,请检查点是否闭合"); } // 只计算最大层,其余层通过缩小计算得出 var tileRegionList = m_mercatorRegions.Select(o => o.GetTileRegion(MaxZoom)); var segments = tileRegionList.Aggregate(Enumerable.Empty <TileSegment>(), (current, region) => current.Concat(region.GetTileSegments())).ToList(); var minY = (long)Math.Floor(segments.Min(o => o.MinY)); var maxY = (long)Math.Floor(segments.Max(o => o.MaxY)); // 每个Y值计算一次交点 var taskGroup = new MapZoom(MaxZoom); for (var i = minY; i <= maxY; i++) { var y = i; var matchSegments = segments.Where(o => (o.MaxY >= y) && (o.MinY <= y)); var intersectList = new List <TilePoint>(); foreach (var s in matchSegments) { intersectList.Add(s.IntersectY(y)); } // 分解任务 intersectList = intersectList.OrderBy(o => o.X).ToList(); for (var index = 0; index < intersectList.Count; index += 2) { var x1 = (long)Math.Floor(intersectList[index].X); var x2 = (long)Math.Floor(intersectList[index + 1].X); var task = new MapLine { StartX = x1, EndX = x2, Y = y, Zoom = MaxZoom }; taskGroup.AddTask(task); } } // 将线段两点加入任务组 foreach (var s in segments) { taskGroup.AddTask(GetTaskFromTilePoint(s.Point1, MaxZoom)); taskGroup.AddTask(GetTaskFromTilePoint(s.Point2, MaxZoom)); } // 将线段所有x轴点加入任务组 var minX = (long)Math.Floor(segments.Min(o => o.MinX)); var maxX = (long)Math.Floor(segments.Max(o => o.MaxX)); for (var i = minX; i <= maxX; i++) { var x = i; var matchSegments = segments.Where(o => (o.MaxX >= x) && (o.MinX <= x)); foreach (var s in matchSegments) { taskGroup.AddTask(GetTaskFromTilePoint(s.IntersectX(x), MaxZoom)); } } // 整合任务组 m_zoomTasks.Add(taskGroup); var tg = taskGroup; for (var index = MaxZoom - 1; index >= MinZoom; index--) { tg = tg.ScaleTo(index); m_zoomTasks.Add(tg); } }