123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- #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);
- }
- }
- }
- }
|