using System;
using System.ComponentModel.Composition;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using ESRI.ArcGIS.Client.Extensibility;
using ESRI.ArcGIS.Client;
namespace TimeSlider.AddIns
{
[Export(typeof(ICommand))]
[DisplayName("Time Slider Tool")]
public class TimeSliderTool : ICommand
{
#region ICommand members
public void Execute(object parameter)
{
MapApplication.Current.ShowWindow("Time Slider " + MapApplication.Current.SelectedLayer.DisplayName, new TimeSliderWindow());
}
public bool CanExecute(object parameter)
{
ESRI.ArcGIS.Client.FeatureLayer layer = MapApplication.Current.SelectedLayer as ESRI.ArcGIS.Client.FeatureLayer;
if (layer == null)
{
return true;
}
else
{
if (layer.TimeExtent == null)
{
return true;
}
else
{
return true;
}
}
}
public event EventHandler CanExecuteChanged;
#endregion
}
}
<UserControl xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:esri="http://schemas.esri.com/arcgis/client/2009" x:Class="TimeSlider.AddIns.TimeSliderWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="84" d:DesignWidth="681">
<Grid x:Name="LayoutRoot" Background="Transparent" Height="80" Width="676">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30*" />
<ColumnDefinition Width="646*" />
</Grid.ColumnDefinitions>
<toolkit:BureauBlackTheme Grid.ColumnSpan="2" Margin="7,0,7,20" />
<StackPanel Orientation="Vertical" Grid.ColumnSpan="2">
<StackPanel Orientation="Horizontal" Margin="0,0,0,1" Grid.ColumnSpan="3" HorizontalAlignment="Left" Width="675" Height="60">
<esri:TimeSlider x:Name="_timeSlider" HorizontalAlignment="Left" Margin="15" VerticalAlignment="Top" Width="600" Height="30"
TimeMode="TimeExtent"
MinimumValue="{Binding Layer.TimeExtent.Start, Mode=OneWay}"
MaximumValue="{Binding Layer.TimeExtent.End, Mode=OneWay}"
Value="{Binding Map.TimeExtent, Mode=TwoWay}" ValueChanged="_timeSlider_ValueChanged" >
</esri:TimeSlider>
<Button Width="30" Height="30" FontSize="20" Click="Config_Click">
<StackPanel Orientation="Horizontal" Height="20" Width="20">
<Image Source="http://###/Apps/Test_Air/Images/config_icon.png" />
</StackPanel>
</Button>
</StackPanel>
<StackPanel Height="17" Width="663">
<sdk:Label Name="_currentTime" Height="15" HorizontalAlignment="Center" HorizontalContentAlignment="Center"/>
</StackPanel>
</StackPanel>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.Extensibility;
namespace TimeSlider.AddIns
{
public partial class TimeSliderWindow : UserControl
{
public Layer Layer
{
get
{
return MapApplication.Current.SelectedLayer as ESRI.ArcGIS.Client.FeatureLayer;
}
}
public Map Map
{
get
{
return MapApplication.Current.Map;
}
}
public int CurrentType
{
get;
set;
}
public string CurrentNumber
{
get;
set;
}
public TimeExtent DefaultTimeExtent
{
get
{
ESRI.ArcGIS.Client.FeatureLayer layer = Layer as ESRI.ArcGIS.Client.FeatureLayer;
return layer.TimeExtent;
}
}
public IEnumerable<DateTime> DefaultIntervals
{
get
{
return ESRI.ArcGIS.Client.Toolkit.TimeSlider.CreateTimeStopsByTimeInterval(DefaultTimeExtent, TimeSpan.FromDays(1));
}
}
public TimeExtent DefaultSliderValue
{
get
{
ESRI.ArcGIS.Client.FeatureLayer layer = Layer as ESRI.ArcGIS.Client.FeatureLayer;
return new TimeExtent(layer.TimeExtent.Start, layer.TimeExtent.Start.AddDays(1));
}
}
public DateTime DefaultStart
{
get
{
ESRI.ArcGIS.Client.FeatureLayer layer = Layer as ESRI.ArcGIS.Client.FeatureLayer;
return layer.TimeExtent.Start;
}
}
public DateTime DefaultEnd
{
get
{
ESRI.ArcGIS.Client.FeatureLayer layer = Layer as ESRI.ArcGIS.Client.FeatureLayer;
return layer.TimeExtent.End;
}
}
public TimeExtent UpdatedValue
{
get;
set;
}
public TimeSliderWindow()
{
InitializeComponent();
_timeSlider.MinimumValue = DefaultStart;
_timeSlider.MaximumValue = DefaultEnd;
_timeSlider.Intervals = DefaultIntervals;
_timeSlider.Value = DefaultSliderValue;
CurrentNumber = "1";
CurrentType = 1;
}
private void Config_Click(object sender, RoutedEventArgs e)
{
ConfigurationWindow config = new ConfigurationWindow(this);
DateTime storeStartDate = new DateTime(_timeSlider.MinimumValue.Year, _timeSlider.MinimumValue.Month,
_timeSlider.MinimumValue.Day, _timeSlider.MinimumValue.Hour, _timeSlider.MinimumValue.Minute, _timeSlider.MinimumValue.Second);
DateTime storeEndDate = new DateTime(_timeSlider.MaximumValue.Year, _timeSlider.MaximumValue.Month,
_timeSlider.MaximumValue.Day, _timeSlider.MaximumValue.Hour, _timeSlider.MaximumValue.Minute, _timeSlider.MaximumValue.Second);
config._startDatePicker.SelectedDate = storeStartDate;
config._endDatePicker.SelectedDate = storeEndDate;
config._startTimePicker.Value = storeStartDate;
config._endTimePicker.Value = storeEndDate;
config._typeSelect.SelectedIndex = CurrentType;
config._numberText.Text = CurrentNumber;
config._startDatePicker.DisplayDateStart = DefaultTimeExtent.Start;
config._startDatePicker.DisplayDateEnd = DefaultTimeExtent.End;
config._endDatePicker.DisplayDateStart = DefaultTimeExtent.Start;
config._endDatePicker.DisplayDateEnd = DefaultTimeExtent.End;
config.Show();
}
private bool checkDateRange(DateTime start, DateTime end)
{
if (start >= DefaultTimeExtent.Start && start <= DefaultTimeExtent.End && end >= DefaultTimeExtent.Start
&& end <= DefaultTimeExtent.End)
{
if (start > end)
{
new ErrorWindow("End date/time cannot be before the start date/time.").Show();
return false;
}
}
else
{
new ErrorWindow("Invalid time extent for the current selected layer.").Show();
return false;
}
return true;
}
public bool accessSlider(DateTime start, DateTime end, string number, string type)
{
if (!checkDateRange(start, end))
{
return false;
}
else
{
TimeExtent extent = new TimeExtent(start, end);
IEnumerable<DateTime> intervals = generateIntervals(start, end, number, type, extent);
updateSlider(intervals, start, end);
return true;
}
}
private IEnumerable<DateTime> generateIntervals(DateTime start, DateTime end, string number, string type, TimeExtent extent)
{
switch (type)
{
case "Week":
CurrentNumber = number;
CurrentType = 0;
UpdatedValue = new TimeExtent(start, start.AddDays(Convert.ToInt32(number) * 7));
return ESRI.ArcGIS.Client.Toolkit.TimeSlider.CreateTimeStopsByTimeInterval(extent, TimeSpan.FromDays(Convert.ToInt32(number) * 7));
case "Day":
CurrentNumber = number;
CurrentType = 1;
UpdatedValue = new TimeExtent(start, start.AddDays(Convert.ToInt32(number)));
return ESRI.ArcGIS.Client.Toolkit.TimeSlider.CreateTimeStopsByTimeInterval(extent, TimeSpan.FromDays(Convert.ToInt32(number)));
case "Hour":
CurrentNumber = number;
CurrentType = 2;
UpdatedValue = new TimeExtent(start, start.AddHours(Convert.ToInt32(number)));
return ESRI.ArcGIS.Client.Toolkit.TimeSlider.CreateTimeStopsByTimeInterval(extent, TimeSpan.FromHours(Convert.ToInt32(number)));
case "Minute":
CurrentNumber = number;
CurrentType = 3;
UpdatedValue = new TimeExtent(start, start.AddMinutes(Convert.ToInt32(number)));
return ESRI.ArcGIS.Client.Toolkit.TimeSlider.CreateTimeStopsByTimeInterval(extent, TimeSpan.FromMinutes(Convert.ToInt32(number)));
default:
CurrentNumber = "1";
CurrentType = 1;
UpdatedValue = DefaultSliderValue;
return DefaultIntervals;
}
}
private void updateSlider(IEnumerable<DateTime> intervals, DateTime start, DateTime end)
{
_timeSlider.MinimumValue = start;
_timeSlider.MaximumValue = end;
_timeSlider.Intervals = intervals;
_timeSlider.Value = UpdatedValue;
}
private void _timeSlider_ValueChanged(object sender, ESRI.ArcGIS.Client.Toolkit.TimeSlider.ValueChangedEventArgs e)
{
Map.TimeExtent = new TimeExtent();
Map.TimeExtent.Start = _timeSlider.Value.Start;
Map.TimeExtent.End = _timeSlider.Value.End;
_currentTime.Content = "Time: FROM " + TimeZoneInfo.ConvertTime(_timeSlider.Value.Start, TimeZoneInfo.Utc).ToString() + " TO " + TimeZoneInfo.ConvertTime(_timeSlider.Value.End, TimeZoneInfo.Utc).ToString();
}
}
}
<controls:ChildWindow xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="TimeSlider.AddIns.ConfigurationWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
Width="403" Height="321"
Title="Time Slider Configuration">
<Grid x:Name="LayoutRoot" Margin="2">
<Grid.RowDefinitions>
<RowDefinition Height="245*" />
<RowDefinition Height="37" />
</Grid.RowDefinitions>
<toolkit:BureauBlackTheme Margin="0,0,-9,-10" Grid.RowSpan="2" />
<Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,6,0,8" Grid.Row="1" />
<Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,6,79,8" Grid.Row="1" />
<StackPanel Height="29" Name="StartPanel" Width="346" Orientation="Horizontal" Margin="18,0,16,170" VerticalAlignment="Bottom">
<sdk:Label Height="25" Name="_startLabel" Width="76" Content="Start Time:" Foreground="White" />
<sdk:DatePicker Height="23" Name="_startDatePicker" Width="120" />
<sdk:Label Height="23" Name="label5" Width="12" Content=" |" />
<toolkit:TimePicker Height="24" Name="_startTimePicker" PopupMinutesInterval="15" Foreground="White" />
</StackPanel>
<StackPanel Height="29" Name="EndPanel" Width="346" Orientation="Horizontal" Margin="18,0,16,135" VerticalAlignment="Bottom">
<sdk:Label Height="25" Name="_endLabel" Width="76" Content="End Time:" Foreground="White" />
<sdk:DatePicker Height="23" Name="_endDatePicker" Width="120" />
<sdk:Label Height="23" Name="label6" Width="12" Content=" |" />
<toolkit:TimePicker Height="24" Name="_endTimePicker" PopupMinutesInterval="15" Foreground="White" />
</StackPanel>
<StackPanel Height="25" HorizontalAlignment="Left" Margin="18,12,0,0" Name="stackPanel1" VerticalAlignment="Top" Width="346">
<sdk:Label Height="19" Name="label1" Width="116" Content="Time Span" FontSize="14" HorizontalAlignment="Center" FontWeight="SemiBold" Foreground="White" />
</StackPanel>
<StackPanel Height="24" HorizontalAlignment="Left" Margin="12,135,0,0" Name="stackPanel2" VerticalAlignment="Top" Width="352">
<sdk:Label Height="30" Name="label2" Width="185" Content="Time Display Intervals" FontSize="14" FontWeight="SemiBold" HorizontalAlignment="Center" Foreground="White" />
</StackPanel>
<StackPanel Height="32" HorizontalAlignment="Left" Margin="18,171,0,0" Name="stackPanel3" VerticalAlignment="Top" Width="346" Orientation="Horizontal">
<TextBox Height="24" Name="_numberText" Width="36" Text="1" />
<sdk:Label Height="27" Name="label3" Width="20" Content=" |" DataContext="{Binding}" />
<ComboBox Height="23" Name="_typeSelect" Width="120" VerticalAlignment="Center">
<ComboBoxItem Content="Week" />
<ComboBoxItem Content="Day" />
<ComboBoxItem Content="Hour" />
<ComboBoxItem Content="Minute" />
</ComboBox>
</StackPanel>
<Border BorderBrush="White" BorderThickness="2" Height="113" HorizontalAlignment="Left" Margin="8,6,0,0" Name="border1" VerticalAlignment="Top" Width="363">
</Border>
<Border BorderBrush="White" BorderThickness="2" Height="99" HorizontalAlignment="Left" Margin="8,125,0,0" Name="border2" VerticalAlignment="Top" Width="363">
</Border>
</Grid>
</controls:ChildWindow>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using ESRI.ArcGIS.Client.Extensibility;
namespace TimeSlider.AddIns
{
public partial class ConfigurationWindow : ChildWindow
{
private TimeSliderWindow timeSlider;
public ConfigurationWindow(TimeSliderWindow timeSlider)
{
InitializeComponent();
this.timeSlider = timeSlider;
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
DateTime selectedStartDateTime = DateTime.MinValue;
DateTime selectedEndDateTime = DateTime.MaxValue;
string number;
string type;
if (_startDatePicker.SelectedDate != null && _startTimePicker.Value != null)
{
DateTime selStartDate = _startDatePicker.SelectedDate.Value;
DateTime? tempTime = _startTimePicker.Value;
DateTime selTime = tempTime.Value;
TimeSpan timeOfStartDay = selTime.TimeOfDay;
selectedStartDateTime = new DateTime(selStartDate.Year, selStartDate.Month, selStartDate.Day,
timeOfStartDay.Hours, timeOfStartDay.Minutes, timeOfStartDay.Seconds);
}
if (_endDatePicker.SelectedDate != null && _endTimePicker.Value != null)
{
DateTime selEndDate = _endDatePicker.SelectedDate.Value;
DateTime? tempTime = _endTimePicker.Value;
DateTime selTime = tempTime.Value;
TimeSpan timeOfEndDay = selTime.TimeOfDay;
selectedEndDateTime = new DateTime(selEndDate.Year, selEndDate.Month, selEndDate.Day,
timeOfEndDay.Hours, timeOfEndDay.Minutes, timeOfEndDay.Seconds);
}
number = _numberText.Text;
type = _typeSelect.SelectionBoxItem.ToString();
if (selectedStartDateTime != DateTime.MinValue && selectedEndDateTime != DateTime.MaxValue)
{
updateSlider(selectedStartDateTime, selectedEndDateTime, number, type);
}
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void updateSlider(DateTime start, DateTime end, string inputNo, string inputString)
{
bool check = timeSlider.accessSlider(start, end, inputNo, inputString);
if (check)
{
this.Close();
}
}
}
}
<controls:ChildWindow xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" x:Class="TimeSlider.AddIns.ErrorWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" Width="400" Height="155" Title="Error"> <Grid x:Name="LayoutRoot" Margin="2"> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <toolkit:BureauBlackTheme Grid.RowSpan="2" /> <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,0,12,12" Grid.Row="1" /> <StackPanel Height="81" HorizontalAlignment="Left" Name="stackPanel1" VerticalAlignment="Top" Width="378"></StackPanel> <StackPanel Name="stackPanel2" Margin="12,11,209,25" Grid.RowSpan="2"> <Image Height="66" Name="image1" Stretch="Fill" Width="128" Source="http://###/Apps/Test_Air/Images/error.png" /> </StackPanel> <StackPanel Height="71" Name="stackPanel3" Margin="176,6,0,4"> <TextBlock Height="66" Name="_errorText" Text="Error text goes here" Foreground="White" FontSize="14" TextAlignment="Left" TextTrimming="None" TextWrapping="Wrap" Width="190" /> </StackPanel> </Grid> </controls:ChildWindow>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace TimeSlider.AddIns
{
public partial class ErrorWindow : ChildWindow
{
public ErrorWindow(String error)
{
InitializeComponent();
_errorText.Text = error;
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
}
}
public class TimeSliderTool : ICommand
{
private TimeSliderWindow timeSliderUI = new TimeSliderWindow(); //from ESRI EXAMPLE
#region ICommand members
public void Execute(object parameter)
{
timeSliderUI = new TimeSliderWindow(); //from ESRI EXAMPLE
MapApplication.Current.ShowWindow("Time Slider", timeSliderUI); //from ESRI EXAMPLE
//MapApplication.Current.ShowWindow("Time Slider", new TimeSliderWindow(),false,null,null,WindowType.Floating);
}