In einem meiner Posts habe ich darüber geschrieben wie einfach es unter Windows Phone 8.1 ist, einen Anruf zu starten oder eine E-Mail zu schreiben. Da ich diese Funktion nun an mehreren Stellen brauche, habe ich jeweils ein Behavior daraus gemacht. Damit dieses Behavior auch per Blend verwendet werden kann und weil es einfacher zu realisieren ist als attached Behaviors, habe ich es als Blend Behavior gemacht.

Für Blend Behaviors benötigt man unter Windows Phone 8.1 das Behavior SDK. Darin befindet sich die Schnittstelle IBehavior. Jene schreibt die Methoden Attach, Detach und die Property AssociatedObject vor. Attach wird ausgelöst, sobald das Behavior an ein Element gehangen wird, dieses Element bekommt man dann auch übergeben und muss es als AssociatedObject bereitstellen. Detach wiederum wird aufgerufen wenn das Behavior vom Element entfernt bzw. das Element zerstört wird an dem es gebunden ist.

public class CallPhoneNumberBehavior : DependencyObject, IBehavior
{
   public static readonly DependencyProperty NumberProperty = DependencyProperty.Register("Number", typeof(string), typeof(CallPhoneNumberBehavior), new PropertyMetadata(default(string)));
   public string Number
   {
      get
      {
        return (string)GetValue(NumberProperty);
      }
      set
      {
        SetValue(NumberProperty, value);
      }
   }
   public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(CallPhoneNumberBehavior), new PropertyMetadata(default(string)));
   public string Name
   {
      get
      {
        return (string)GetValue(NameProperty);
      }
      set
      {
        SetValue(NameProperty, value);
      }
   }
   private UIElement element;
   public void Attach(DependencyObject associatedObject)
   { 
      this.element = associatedObject as UIElement;
      this.element.Tapped += OnTapped;
   }
   private void OnTapped(object sender, TappedRoutedEventArgs e)
   {
      if (!string.IsNullOrEmpty(this.Number))
      {
         PhoneCallManager.ShowPhoneCallUI(Number, Name);
      }
   }
   public void Detach()
   {
      this.element.Tapped -= OnTapped;
   }
   public DependencyObject AssociatedObject
   {
      get
      {
        return this.element;
      }
   }
}

Basierend darauf ist der Rest sehr einfach. Alle Werte für den Anruf oder die Mail werden als Dependency Properties entgegen genommen. Dies erlaubt sie später auch für das Binding zu verwenden. Wurde mindestens eine Nummer angegeben, kann diese dann angerufen werden wenn auf das Element geklickt wurde, an welches das Behavior gebunden ist.

Anschließend muss man es mit jenem Element noch verbinden, wobei dies auch per Drag and Drop in Blend geschehen kann:

<TextBlock Text="📞" Style="{StaticResource IconTextBlockStyle}" >
   <interactivity:Interaction.Behaviors>
      <WelcomeApp:CallPhoneNumberBehavior Name="{Binding Authority.Name}" Number="{Binding Authority.Phone}"/>
   </interactivity:Interaction.Behaviors>
</TextBlock>