| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | #if XFORMSnamespace Caliburn.Micro.Core.Xamarin.Forms#elsenamespace 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);            }        }    }}
 |