No problem. I utilize one bookmark for users and one for predefined areas.[ATTACH=CONFIG]31150[/ATTACH]
public partial class CustomBookmark : UserControl, ICommand
{
public int _SelectedIndex = -1;
public string _SelectedName = null;
private CustomBookmark mywindow = null;
private CustomBookmark myBookmark = null;
Bookmark.MapBookmark bookmark = new Bookmark.MapBookmark();
public CustomBookmark()
{
InitializeComponent();
MapApplication.Current.Initialized += Layers_LayersInitialized;
}
void Layers_LayersInitialized(object sender, EventArgs args)
{
myBookmark = myBookmark ?? new CustomBookmark();
Envelope myExtent = new Envelope(-13544922.588580575, 6058265.2502668081, -13621063.588580577, 6025801.7182497317);
TestBookmarks.AddBookmark("District All", myExtent);
}
private void BookmarkList_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
// This function obtains the index location of the last cell a user clicked in the DataGrid
// sub-component in the Bookmark Control. It stores that value in the Global variable _SelectedIndex.
// Note: There is a bug in the Bookmark.SelectionChanged Event where it always fires twice when a
// DataGrid cell is selected. The first time the Bookmark.SelectionChanged Event fires the correct
// DataGrid.SelectedIndex value is obtained but then the Event fires a second time and always
// set the DataGrid.SelectedIndex value to -1. So this code is a workaround.
// Get the DataGrid sub-component of the Bookmark Control.
DataGrid myDataGrid = (DataGrid)sender;
// Get the ObservableCollection<MapBookmark> objects (aka. the named Map.Extent values).
System.Collections.ObjectModel.ObservableCollection<ESRI.ArcGIS.Client.Toolkit.Bookmark.MapBookmark> theBookmarks = null;
theBookmarks = MyBookmarks.Bookmarks;
//theBookmarks = myDataGrid.ItemsSource; // This would work too!
// Only perform this operation if there at least one named Map.Extent (aka. a bookmark) value.
if (theBookmarks.Count > 0)
{
// Screen out the second firing of this Event.
if (myDataGrid.SelectedIndex != -1)
{
// Set the Member variable to the currently selected cell in the DataGrid sub-component of the BookMark
// Control. NOTE: the DataGrid.SelectionMode was set to 'Single' in XAML so that only one bookmark could
// be selected at a time for the ClearSelectedBookmark Button to work appropriately.
_SelectedIndex = myDataGrid.SelectedIndex;
_SelectedName = myDataGrid.SelectedItem.ToString();
}
}
}
private void ClearSelectedBookmark_Click(object sender, System.Windows.RoutedEventArgs e)
{
// This function deletes a named Map.Extent (aka. a bookmark) from the DataGrid portion of the
// Bookmark Control via its index location. The _SelectedIndex object is a global (aka. Member)
// variable and hold the current value of the DataGrid.SelectedItem.
// Only process _SelectedIndex values not equal to -1.
if (_SelectedIndex != -1)
{
// Delete the specific named Map.Extent (aka. a bookmark) at the specified _SelectedIndex value.
MyBookmarks.DeleteBookmarkAt(_SelectedIndex);
}
}
private void AddBookmarkNEW_Click(object sender, System.Windows.RoutedEventArgs e)
{
// This function obtains the sub-component TextBox that of the Bookmark Control where the user
// enters a name for the Map.Extent from the XAML hierarchy defined in the ControlTemplate. In
// the case of the XAML code you need to go up two levels (i.e. Parent) in order to use the
// .FindName() function to obtain the desired TextBox by its name. Then add a named Map.Extent
// (aka. a bookmark) to the DataGrid sub-components of the Bookmark Control. Finally, clear out
// the text of the TextBox after the newly added Bookmark was added.
// Traverse through the ControlTemplate hierarchy of controls to find the desired TextBox.
Button myButton = (Button)sender;
Grid myGrid1 = (Grid)myButton.Parent;
Grid mygrid2 = (Grid)myGrid1.Parent;
TextBox myTextBox = (TextBox)mygrid2.FindName("AddBookmarkName");
// Add a bookmark for the current Map.Extent using the name in the TextBox provided by the user.
MyBookmarks.AddBookmark(myTextBox.Text, MapApplication.Current.Map.Extent);
// Clear out the text in the TextBox for the next round.
myTextBox.Text = "";
}
private void CopyBookmarkLink_Click(object sender, RoutedEventArgs e)
{
// Get the ObservableCollection<MapBookmark> objects (aka. the named Map.Extent values).
System.Collections.ObjectModel.ObservableCollection<ESRI.ArcGIS.Client.Toolkit.Bookmark.MapBookmark> theBookmarks = null;
theBookmarks = MyBookmarks.Bookmarks;
// Only perform this operation if there at least one named Map.Extent (aka. a bookmark) value.
if (theBookmarks.Count > 0)
{
foreach (ESRI.ArcGIS.Client.Toolkit.Bookmark.MapBookmark bookmark in theBookmarks)
{
if (bookmark.Name == _SelectedName)
{
string link = HtmlPage.Document.DocumentUri.ToString() + "/index.htm?extent=" + bookmark.Extent.XMin + "," + bookmark.Extent.YMin + "," + bookmark.Extent.XMax + "," + bookmark.Extent.YMax;
MessageBox.Show(bookmark.Name + " link copied to clipboard.", bookmark.Name + " Copied", MessageBoxButton.OK);
Clipboard.SetText(HtmlPage.Document.DocumentUri.ToString() + "/index.htm?extent=" + MapApplication.Current.Map.Extent.XMin + "," + MapApplication.Current.Map.Extent.YMin + "," + MapApplication.Current.Map.Extent.XMax + "," + MapApplication.Current.Map.Extent.YMax);
}
}
}
}
public void Execute(object parameter)
{
mywindow = mywindow ?? new CustomBookmark();
MapApplication.Current.ShowWindow("", mywindow);
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
}
}