All the controls missing in WPF. Over 1 million downloads.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

301 lines
12 KiB

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Data;
namespace Microsoft.Windows.Controls
{
public class Wizard : ItemsControl
{
#region Properties
public static readonly DependencyProperty BackButtonContentProperty = DependencyProperty.Register("BackButtonContent", typeof(object), typeof(Wizard), new UIPropertyMetadata("Back"));
public object BackButtonContent
{
get { return (object)GetValue(BackButtonContentProperty); }
set { SetValue(BackButtonContentProperty, value); }
}
public static readonly DependencyProperty BackButtonVisibilityProperty = DependencyProperty.Register("BackButtonVisibility", typeof(Visibility), typeof(Wizard), new UIPropertyMetadata(Visibility.Visible));
public Visibility BackButtonVisibility
{
get { return (Visibility)GetValue(BackButtonVisibilityProperty); }
set { SetValue(BackButtonVisibilityProperty, value); }
}
public static readonly DependencyProperty CancelButtonContentProperty = DependencyProperty.Register("CancelButtonContent", typeof(object), typeof(Wizard), new UIPropertyMetadata("Cancel"));
public object CancelButtonContent
{
get { return (object)GetValue(CancelButtonContentProperty); }
set { SetValue(CancelButtonContentProperty, value); }
}
public static readonly DependencyProperty CancelButtonVisibilityProperty = DependencyProperty.Register("CancelButtonVisibility", typeof(Visibility), typeof(Wizard), new UIPropertyMetadata(Visibility.Visible));
public Visibility CancelButtonVisibility
{
get { return (Visibility)GetValue(CancelButtonVisibilityProperty); }
set { SetValue(CancelButtonVisibilityProperty, value); }
}
#region CurrentPage
public static readonly DependencyProperty CurrentPageProperty = DependencyProperty.Register("CurrentPage", typeof(WizardPage), typeof(Wizard), new UIPropertyMetadata(null, OnCurrentPageChanged));
public WizardPage CurrentPage
{
get { return (WizardPage)GetValue(CurrentPageProperty); }
set { SetValue(CurrentPageProperty, value); }
}
private static void OnCurrentPageChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
Wizard wizard = o as Wizard;
if (wizard != null)
wizard.OnCurrentPageChanged((WizardPage)e.OldValue, (WizardPage)e.NewValue);
}
protected virtual void OnCurrentPageChanged(WizardPage oldValue, WizardPage newValue)
{
RaiseRoutedEvent(Wizard.PageChangedEvent);
}
#endregion //CurrentPage
public static readonly DependencyProperty FinishButtonContentProperty = DependencyProperty.Register("FinishButtonContent", typeof(object), typeof(Wizard), new UIPropertyMetadata("Finish"));
public object FinishButtonContent
{
get { return (object)GetValue(FinishButtonContentProperty); }
set { SetValue(FinishButtonContentProperty, value); }
}
public static readonly DependencyProperty FinishButtonVisibilityProperty = DependencyProperty.Register("FinishButtonVisibility", typeof(Visibility), typeof(Wizard), new UIPropertyMetadata(Visibility.Visible));
public Visibility FinishButtonVisibility
{
get { return (Visibility)GetValue(FinishButtonVisibilityProperty); }
set { SetValue(FinishButtonVisibilityProperty, value); }
}
public static readonly DependencyProperty HelpButtonContentProperty = DependencyProperty.Register("HelpButtonContent", typeof(object), typeof(Wizard), new UIPropertyMetadata("Help"));
public object HelpButtonContent
{
get { return (object)GetValue(HelpButtonContentProperty); }
set { SetValue(HelpButtonContentProperty, value); }
}
public static readonly DependencyProperty HelpButtonVisibilityProperty = DependencyProperty.Register("HelpButtonVisibility", typeof(Visibility), typeof(Wizard), new UIPropertyMetadata(Visibility.Visible));
public Visibility HelpButtonVisibility
{
get { return (Visibility)GetValue(HelpButtonVisibilityProperty); }
set { SetValue(HelpButtonVisibilityProperty, value); }
}
public static readonly DependencyProperty NextButtonContentProperty = DependencyProperty.Register("NextButtonContent", typeof(object), typeof(Wizard), new UIPropertyMetadata("Next"));
public object NextButtonContent
{
get { return (object)GetValue(NextButtonContentProperty); }
set { SetValue(NextButtonContentProperty, value); }
}
public static readonly DependencyProperty NextButtonVisibilityProperty = DependencyProperty.Register("NextButtonVisibility", typeof(Visibility), typeof(Wizard), new UIPropertyMetadata(Visibility.Visible));
public Visibility NextButtonVisibility
{
get { return (Visibility)GetValue(NextButtonVisibilityProperty); }
set { SetValue(NextButtonVisibilityProperty, value); }
}
#endregion //Properties
#region Constructors
static Wizard()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(Wizard), new FrameworkPropertyMetadata(typeof(Wizard)));
}
public Wizard()
{
CommandBindings.Add(new CommandBinding(WizardCommands.Cancel, CancelWizard, CanCancelWizard));
CommandBindings.Add(new CommandBinding(WizardCommands.Finish, FinishWizard, CanFinishWizard));
CommandBindings.Add(new CommandBinding(WizardCommands.Help, RequestHelp, CanRequestHelp));
CommandBindings.Add(new CommandBinding(WizardCommands.NextPage, SelectNextPage, CanSelectNextPage));
CommandBindings.Add(new CommandBinding(WizardCommands.PreviousPage, SelectPreviousPage, CanSelectPreviousPage));
}
#endregion //Constructors
#region Base Class Overrides
protected override DependencyObject GetContainerForItemOverride()
{
return new WizardPage();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return (item is WizardPage);
}
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
if (Items.Count > 0 && CurrentPage == null)
CurrentPage = Items[0] as WizardPage;
}
#endregion //Base Class Overrides
#region Commands
private void CancelWizard(object sender, ExecutedRoutedEventArgs e)
{
RaiseRoutedEvent(Wizard.CancelEvent);
}
private void CanCancelWizard(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = false;
}
private void FinishWizard(object sender, ExecutedRoutedEventArgs e)
{
RaiseRoutedEvent(Wizard.FinishEvent);
}
private void CanFinishWizard(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = false;
}
private void RequestHelp(object sender, ExecutedRoutedEventArgs e)
{
RaiseRoutedEvent(Wizard.HelpEvent);
}
private void CanRequestHelp(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = false;
}
private void SelectNextPage(object sender, ExecutedRoutedEventArgs e)
{
WizardPage nextPage = null;
if (CurrentPage != null)
{
//check next page
if (CurrentPage.NextPage != null)
nextPage = CurrentPage.NextPage;
else
{
//no next page defined use index
var currentIndex = Items.IndexOf(CurrentPage);
var nextPageIndex = currentIndex + 1;
if (nextPageIndex < Items.Count)
nextPage = Items[nextPageIndex] as WizardPage;
}
}
CurrentPage = nextPage;
}
private void CanSelectNextPage(object sender, CanExecuteRoutedEventArgs e)
{
if (CurrentPage != null)
{
if (CurrentPage.NextPage != null)
e.CanExecute = true;
else
{
var currentIndex = Items.IndexOf(CurrentPage);
var nextPageIndex = currentIndex + 1;
if (nextPageIndex < Items.Count)
e.CanExecute = true;
}
}
}
private void SelectPreviousPage(object sender, ExecutedRoutedEventArgs e)
{
WizardPage previousPage = null;
if (CurrentPage != null)
{
//check previous page
if (CurrentPage.PreviousPage != null)
previousPage = CurrentPage.PreviousPage;
else
{
//no previous page defined so use index
var currentIndex = Items.IndexOf(CurrentPage);
var previousPageIndex = currentIndex - 1;
if (previousPageIndex > 0 && previousPageIndex < Items.Count)
previousPage = Items[previousPageIndex] as WizardPage;
}
}
CurrentPage = previousPage;
}
private void CanSelectPreviousPage(object sender, CanExecuteRoutedEventArgs e)
{
if (CurrentPage != null)
{
if (CurrentPage.PreviousPage != null)
e.CanExecute = true;
else
{
var currentIndex = Items.IndexOf(CurrentPage);
var previousPageIndex = currentIndex - 1;
if (previousPageIndex > 0 && previousPageIndex < Items.Count)
e.CanExecute = true;
}
}
}
#endregion //Commands
#region Events
public static readonly RoutedEvent CancelEvent = EventManager.RegisterRoutedEvent("Cancel", RoutingStrategy.Bubble, typeof(EventHandler), typeof(Wizard));
public event RoutedEventHandler Cancel
{
add { AddHandler(CancelEvent, value); }
remove { RemoveHandler(CancelEvent, value); }
}
public static readonly RoutedEvent PageChangedEvent = EventManager.RegisterRoutedEvent("PageChanged", RoutingStrategy.Bubble, typeof(EventHandler), typeof(Wizard));
public event RoutedEventHandler PageChanged
{
add { AddHandler(PageChangedEvent, value); }
remove { RemoveHandler(PageChangedEvent, value); }
}
public static readonly RoutedEvent FinishEvent = EventManager.RegisterRoutedEvent("Finish", RoutingStrategy.Bubble, typeof(EventHandler), typeof(Wizard));
public event RoutedEventHandler Finish
{
add { AddHandler(FinishEvent, value); }
remove { RemoveHandler(FinishEvent, value); }
}
public static readonly RoutedEvent HelpEvent = EventManager.RegisterRoutedEvent("Help", RoutingStrategy.Bubble, typeof(EventHandler), typeof(Wizard));
public event RoutedEventHandler Help
{
add { AddHandler(HelpEvent, value); }
remove { RemoveHandler(HelpEvent, value); }
}
#endregion //Events
#region Methods
private void RaiseRoutedEvent(RoutedEvent routedEvent)
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(routedEvent, this);
base.RaiseEvent(newEventArgs);
}
#endregion //Methods
}
}