Sic.Framework-Nanjing-Baishi/MECF.Framework.UI.Client/Caliburn.Micro/Core/Screen.cs

170 lines
5.4 KiB
C#

namespace Caliburn.Micro.Core {
using System;
/// <summary>
/// A base implementation of <see cref = "IScreen" />.
/// </summary>
public class Screen : ViewAware, IScreen, IChild {
static readonly ILog Log = LogManager.GetLog(typeof (Screen));
bool isActive;
bool isInitialized;
object parent;
string displayName;
/// <summary>
/// Creates an instance of the screen.
/// </summary>
public Screen() {
displayName = GetType().FullName;
}
/// <summary>
/// Gets or Sets the Parent <see cref = "IConductor" />
/// </summary>
public virtual object Parent {
get { return parent; }
set {
parent = value;
NotifyOfPropertyChange("Parent");
}
}
/// <summary>
/// Gets or Sets the Display Name
/// </summary>
public virtual string DisplayName {
get { return displayName; }
set {
displayName = value;
NotifyOfPropertyChange("DisplayName");
}
}
/// <summary>
/// Indicates whether or not this instance is currently active.
/// Virtualized in order to help with document oriented view models.
/// </summary>
public virtual bool IsActive {
get { return isActive; }
private set {
isActive = value;
NotifyOfPropertyChange("IsActive");
}
}
/// <summary>
/// Indicates whether or not this instance is currently initialized.
/// Virtualized in order to help with document oriented view models.
/// </summary>
public virtual bool IsInitialized {
get { return isInitialized; }
private set {
isInitialized = value;
NotifyOfPropertyChange("IsInitialized");
}
}
/// <summary>
/// Raised after activation occurs.
/// </summary>
public virtual event EventHandler<ActivationEventArgs> Activated = delegate { };
/// <summary>
/// Raised before deactivation.
/// </summary>
public virtual event EventHandler<DeactivationEventArgs> AttemptingDeactivation = delegate { };
/// <summary>
/// Raised after deactivation.
/// </summary>
public virtual event EventHandler<DeactivationEventArgs> Deactivated = delegate { };
void IActivate.Activate() {
if (IsActive) {
return;
}
var initialized = false;
if (!IsInitialized) {
IsInitialized = initialized = true;
OnInitialize();
}
IsActive = true;
Log.Info("Activating {0}.", this);
OnActivate();
var handler = Activated;
if (handler != null) {
handler(this, new ActivationEventArgs
{
WasInitialized = initialized
});
}
}
/// <summary>
/// Called when initializing.
/// </summary>
protected virtual void OnInitialize() {}
/// <summary>
/// Called when activating.
/// </summary>
protected virtual void OnActivate() {}
void IDeactivate.Deactivate(bool close) {
if (IsActive || (IsInitialized && close)) {
var attemptingDeactivationHandler = AttemptingDeactivation;
if (attemptingDeactivationHandler != null) {
attemptingDeactivationHandler(this, new DeactivationEventArgs
{
WasClosed = close
});
}
IsActive = false;
Log.Info("Deactivating {0}.", this);
OnDeactivate(close);
var deactivatedHandler = Deactivated;
if (deactivatedHandler != null) {
deactivatedHandler(this, new DeactivationEventArgs
{
WasClosed = close
});
}
if (close) {
Views.Clear();
Log.Info("Closed {0}.", this);
}
}
}
/// <summary>
/// Called when deactivating.
/// </summary>
/// <param name = "close">Inidicates whether this instance will be closed.</param>
protected virtual void OnDeactivate(bool close) {}
/// <summary>
/// Called to check whether or not this instance can close.
/// </summary>
/// <param name = "callback">The implementor calls this action with the result of the close check.</param>
public virtual void CanClose(Action<bool> callback) {
callback(true);
}
/// <summary>
/// Tries to close this instance by asking its Parent to initiate shutdown or by asking its corresponding view to close.
/// Also provides an opportunity to pass a dialog result to it's corresponding view.
/// </summary>
/// <param name="dialogResult">The dialog result.</param>
public virtual void TryClose(bool? dialogResult = null) {
PlatformProvider.Current.GetViewCloseAction(this, Views.Values, dialogResult).OnUIThread();
}
}
}