// // // // // $Revision$ // using System; using System.Diagnostics; using System.Windows; using System.Windows.Input; using System.Windows.Controls; using System.Xml; using ICSharpCode.WpfDesign.Designer.Controls; using ICSharpCode.WpfDesign.Designer.Services; namespace ICSharpCode.WpfDesign.Designer { /// /// Surface hosting the WPF designer. /// public sealed class DesignSurface : SingleVisualChildElement { readonly ScrollViewer _scrollViewer; readonly DesignPanel _designPanel; DesignContext _designContext; /// /// Create a new DesignSurface instance. /// public DesignSurface() { _scrollViewer = new ScrollViewer(); _designPanel = new DesignPanel(); _scrollViewer.Content = _designPanel; _scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Visible; _scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible; this.VisualChild = _scrollViewer; this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Undo, OnUndoExecuted, OnUndoCanExecute)); this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo, OnRedoExecuted, OnRedoCanExecute)); } #region Undo/Redo UndoService _undoService; private UndoService UndoService { get { return _undoService; } set { if (_undoService != null) { _undoService.UndoStackChanged -= OnUndoStackChanged; } _undoService = value; if (_undoService != null) { _undoService.UndoStackChanged += OnUndoStackChanged; } CommandManager.InvalidateRequerySuggested(); } } void OnUndoExecuted(object sender, ExecutedRoutedEventArgs e) { _undoService.Undo(); } void OnUndoCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = _undoService != null && _undoService.CanUndo; } void OnRedoExecuted(object sender, ExecutedRoutedEventArgs e) { _undoService.Redo(); } void OnRedoCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = _undoService != null && _undoService.CanRedo; } void OnUndoStackChanged(object sender, EventArgs e) { CommandManager.InvalidateRequerySuggested(); } #endregion /// /// Gets the active design context. /// public DesignContext DesignContext { get { return _designContext; } } /// /// Initializes the designer content from the specified XmlReader. /// public void LoadDesigner(XmlReader xamlReader) { UnloadDesigner(); InitializeDesigner(new Xaml.XamlDesignContext(xamlReader)); } /// /// Saves the designer content into the specified XmlWriter. /// public void SaveDesigner(XmlWriter writer) { _designContext.Save(writer); } void InitializeDesigner(DesignContext context) { context.Services.AddService(typeof(IDesignPanel), _designPanel); _designContext = context; _designPanel.Context = context; Border designPanelBorder = new Border(); designPanelBorder.Padding = new Thickness(10); _designPanel.Child = designPanelBorder; designPanelBorder.Child = context.RootItem.View; UndoService = context.Services.GetService(); } /// /// Unloads the designer content. /// public void UnloadDesigner() { _designContext = null; _designPanel.Context = null; _designPanel.Child = null; _designPanel.Adorners.Clear(); _designPanel.MarkerCanvas.Children.Clear(); UndoService = null; } } }