Sic04/FrameworkLocal/UIClient/Caliburn.Micro/Message.cs

145 lines
4.8 KiB
C#

#if XFORMS
namespace Caliburn.Micro.Core.Xamarin.Forms
#else
namespace Caliburn.Micro
#endif
{
using System;
using System.Collections.Generic;
using System.Linq;
#if WinRT81
using Windows.UI.Xaml;
using Microsoft.Xaml.Interactivity;
using TriggerBase = Microsoft.Xaml.Interactivity.IBehavior;
#elif XFORMS
using global::Xamarin.Forms;
using UIElement = global::Xamarin.Forms.Element;
using FrameworkElement = global::Xamarin.Forms.VisualElement;
using DependencyProperty = global::Xamarin.Forms.BindableProperty;
using DependencyObject = global::Xamarin.Forms.BindableObject;
#else
using System.Windows;
using System.Windows.Interactivity;
using TriggerBase = System.Windows.Interactivity.TriggerBase;
using Caliburn.Micro.Core;
#endif
/// <summary>
/// Host's attached properties related to routed UI messaging.
/// </summary>
public static class Message {
internal static readonly DependencyProperty HandlerProperty =
DependencyPropertyHelper.RegisterAttached(
"Handler",
typeof(object),
typeof(Message),
null
);
static readonly DependencyProperty MessageTriggersProperty =
DependencyPropertyHelper.RegisterAttached(
"MessageTriggers",
typeof(TriggerBase[]),
typeof(Message),
null
);
/// <summary>
/// Places a message handler on this element.
/// </summary>
/// <param name="d"> The element. </param>
/// <param name="value"> The message handler. </param>
public static void SetHandler(DependencyObject d, object value) {
d.SetValue(HandlerProperty, value);
}
/// <summary>
/// Gets the message handler for this element.
/// </summary>
/// <param name="d"> The element. </param>
/// <returns> The message handler. </returns>
public static object GetHandler(DependencyObject d) {
return d.GetValue(HandlerProperty);
}
/// <summary>
/// A property definition representing attached triggers and messages.
/// </summary>
public static readonly DependencyProperty AttachProperty =
DependencyPropertyHelper.RegisterAttached(
"Attach",
typeof(string),
typeof(Message),
null,
OnAttachChanged
);
/// <summary>
/// Sets the attached triggers and messages.
/// </summary>
/// <param name="d"> The element to attach to. </param>
/// <param name="attachText"> The parsable attachment text. </param>
public static void SetAttach(DependencyObject d, string attachText) {
d.SetValue(AttachProperty, attachText);
}
/// <summary>
/// Gets the attached triggers and messages.
/// </summary>
/// <param name="d"> The element that was attached to. </param>
/// <returns> The parsable attachment text. </returns>
public static string GetAttach(DependencyObject d) {
return d.GetValue(AttachProperty) as string;
}
static void OnAttachChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
if (e.NewValue == e.OldValue) {
return;
}
var messageTriggers = (TriggerBase[])d.GetValue(MessageTriggersProperty);
#if WinRT81
var allTriggers = Interaction.GetBehaviors(d);
if (messageTriggers != null)
{
messageTriggers.OfType<DependencyObject>().Apply(x => allTriggers.Remove(x));
}
var newTriggers = Parser.Parse(d, e.NewValue as string).ToArray();
newTriggers.OfType<DependencyObject>().Apply(allTriggers.Add);
#elif XFORMS
var visualElement = d as VisualElement;
var allTriggers = visualElement != null ? visualElement.Triggers : new List<TriggerBase>();
if (messageTriggers != null) {
messageTriggers.Apply(x => allTriggers.Remove(x));
}
var newTriggers = Parser.Parse(d, e.NewValue as string).ToArray();
newTriggers.Apply(allTriggers.Add);
#else
var allTriggers = Interaction.GetTriggers(d);
if (messageTriggers != null) {
messageTriggers.Apply(x => allTriggers.Remove(x));
}
var newTriggers = Parser.Parse(d, e.NewValue as string).ToArray();
newTriggers.Apply(allTriggers.Add);
#endif
if (newTriggers.Length > 0) {
d.SetValue(MessageTriggersProperty, newTriggers);
}
else {
d.ClearValue(MessageTriggersProperty);
}
}
}
}