|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Windows.Media;
using System.ComponentModel;
namespace ZoomAndPanSample
{
/// <summary>
/// A simple example of a data-model.
/// The purpose of this data-model is to share display data between the main window and overview window.
/// </summary>
public class DataModel : INotifyPropertyChanged
{
#region Data Members
/// <summary>
/// The singleton instance.
/// This is a singleton for convenience.
/// </summary>
private static DataModel instance = new DataModel();
/// <summary>
/// The list of rectangles that is displayed both in the main window and in the overview window.
/// </summary>
private ObservableCollection<RectangleData> rectangles = new ObservableCollection<RectangleData>();
///
/// The current scale at which the content is being viewed.
///
private double contentScale = 1;
///
/// The X coordinate of the offset of the viewport onto the content (in content coordinates).
///
private double contentOffsetX = 0;
///
/// The Y coordinate of the offset of the viewport onto the content (in content coordinates).
///
private double contentOffsetY = 0;
///
/// The width of the content (in content coordinates).
///
private double contentWidth = 2000;
///
/// The heigth of the content (in content coordinates).
///
//fio:
private double contentHeight = 2000;
///
/// The width of the viewport onto the content (in content coordinates).
/// The value for this is actually computed by the main window's ZoomAndPanControl and update in the
/// data model so that the value can be shared with the overview window.
///
private double contentViewportWidth = 0;
///
/// The heigth of the viewport onto the content (in content coordinates).
/// The value for this is actually computed by the main window's ZoomAndPanControl and update in the
/// data model so that the value can be shared with the overview window.
///
private double contentViewportHeight = 0;
#endregion Data Members
/// <summary>
/// Retreive the singleton instance.
/// </summary>
public static DataModel Instance
{
get
{
return instance;
}
}
public DataModel()
{
//
// Populate the data model with some example data.
//
rectangles.Add(new RectangleData(50, 50, 80, 150, Colors.Blue));
rectangles.Add(new RectangleData(550, 350, 80, 150, Colors.Green));
rectangles.Add(new RectangleData(850, 850, 30, 20, Colors.Purple));
rectangles.Add(new RectangleData(1850, 1850, 80, 150, Colors.Red));
}
/// <summary>
/// The list of rectangles that is displayed both in the main window and in the overview window.
/// </summary>
public ObservableCollection<RectangleData> Rectangles
{
get
{
return rectangles;
}
}
///
/// The current scale at which the content is being viewed.
///
public double ContentScale
{
get
{
return contentScale;
}
set
{
contentScale = value;
OnPropertyChanged("ContentScale");
}
}
///
/// The X coordinate of the offset of the viewport onto the content (in content coordinates).
///
public double ContentOffsetX
{
get
{
return contentOffsetX;
}
set
{
contentOffsetX = value;
OnPropertyChanged("ContentOffsetX");
}
}
///
/// The Y coordinate of the offset of the viewport onto the content (in content coordinates).
///
public double ContentOffsetY
{
get
{
return contentOffsetY;
}
set
{
contentOffsetY = value;
OnPropertyChanged("ContentOffsetY");
}
}
///
/// The width of the content (in content coordinates).
///
public double ContentWidth
{
get
{
return contentWidth;
}
set
{
contentWidth = value;
OnPropertyChanged("ContentWidth");
}
}
///
/// The heigth of the content (in content coordinates).
///
public double ContentHeight
{
get
{
return contentHeight;
}
set
{
contentHeight = value;
OnPropertyChanged("ContentHeight");
}
}
///
/// The width of the viewport onto the content (in content coordinates).
/// The value for this is actually computed by the main window's ZoomAndPanControl and update in the
/// data model so that the value can be shared with the overview window.
///
public double ContentViewportWidth
{
get
{
return contentViewportWidth;
}
set
{
contentViewportWidth = value;
OnPropertyChanged("ContentViewportWidth");
}
}
///
/// The heigth of the viewport onto the content (in content coordinates).
/// The value for this is actually computed by the main window's ZoomAndPanControl and update in the
/// data model so that the value can be shared with the overview window.
///
public double ContentViewportHeight
{
get
{
return contentViewportHeight;
}
set
{
contentViewportHeight = value;
OnPropertyChanged("ContentViewportHeight");
}
}
#region INotifyPropertyChanged Members
/// <summary>
/// Raises the 'PropertyChanged' event when the value of a property of the data model has changed.
/// </summary>
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
/// <summary>
/// 'PropertyChanged' event that is raised when the value of a property of the data model has changed.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Software craftsman | Author | Writing rapidfullstackdevelopment.com - Posting about how to survive and flourish as a software developer
Follow on Twitter for news and updates: https://twitter.com/codecapers
I'm writing a new book: Rapid Fullstack Development. Learn from my years of experience and become a better developer.
My second book, Bootstrapping Microservices, is a practical and project-based guide to building distributed applications with microservices.
My first book Data Wrangling with JavaScript is a comprehensive overview of working with data in JavaScript.
Data-Forge Notebook is my notebook-style application for data transformation, analysis and transformation in JavaScript.
I have a long history in software development with many years in apps, web apps, backends, serious games, simulations and VR. Making technology work for business is what I do: building bespoke software solutions that span multiple platforms.
I have years of experience managing development teams, preparing technical strategies and creation of software products. I can explain complicated technology to senior management. I have delivered cutting-edge products in fast-paced and high-pressure environments. I know how to focus and prioritize to get the important things done.
Author
- Rapid Fullstack Development
- Bootstrapping Microservices
- Data Wrangling with JavaScript
Creator of Market Wizard
- https://www.market-wizard.com.au/
Creator of Data-Forge and Data-Forge Notebook
- http://www.data-forge-js.com
- http://www.data-forge-notebook.com
Web
- www.codecapers.com.au
Open source
- https://github.com/ashleydavis
- https://github.com/data-forge
- https://github.com/data-forge-notebook
Skills
- Quickly building MVPs for startups
- Understanding how to get the most out of technology for business
- Developing technical strategies
- Management and coaching of teams & projects
- Microservices, devops, mobile and fullstack software development