Silverlight 4 Rough Notes: Clipboard Access

Note – these posts are put together after a short time with Silverlight 4 as a way of providing pointers to some of the new features that Silverlight 4 has to offer. I’m posting these from the PDC as Silverlight 4 is announced for the first time so please bear that in mind when working through these posts.

I must use the clipboard hundreds of times a day. Business applications need clipboard access. Silverlight 3 only provided clipboard access in the form of a couple of built-in controls ( like TextBox ) providing copy/paste automatically like most TextBoxes in the world already do.

But in Silverlight 4 this is expanded to allow for more complete clipboard access.

Like many features in Silverlight, clipboard access must be in response to a user-initiated access ( i.e. you can’t write code on some background thread that tries to grab the clipboard – you must run this kind of code in response to a user action like a button click ).

Also, the formats for data on the clipboard are restricted. At the time of writing, the only format supported is text and so the clipboard class has 3 simple methods;

  • ContainsText
  • GetText
  • SetText

So, it’s beyond simple right now to interact with the Clipboard. If we have a UI such as;

<UserControl x:Class="SilverlightApplication9.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Button
            Margin="10"
            Content="Paste"
            Click="Paste" />
        <TextBlock
            x:Name="txtText"
            Margin="10"
            Text="{Binding Text}"
            Grid.Row="1" />
        <Button
            Margin="10"
            Click="Copy"
            Content="Copy"
            Grid.Row="2" />
    </Grid>
</UserControl>

and a little bit of code running behind it such as;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication9
{
  public partial class MainPage : UserControl
  {
    public MainPage()
    {
      InitializeComponent();      
    }

    private void Paste(object sender, RoutedEventArgs e)
    {
      if (Clipboard.ContainsText())
      {
        txtText.Text = Clipboard.GetText();
      }
    }

    private void Copy(object sender, RoutedEventArgs e)
    {
      Clipboard.SetText(txtText.Text);
    }
  }
}

then running that up gives me a UI like;

image

and clicking that Paste button puts up a consent UI;

image

If the user clicks No then the call to Clipboard.GetText() throws so that’s worth knowing about whereas if they click Yes then all’s well;

image

So – easy enough to have Clipboard access ( for text ) in a Silverlight 4 application. I’m hoping that one or two more formats might be enabled ( e.g. Images? ) as previews progress.