En la actualidad, las aplicaciones en Silverlight no nos permiten seleccionar y copiar texto de una manera cómoda, sin utilizar las llamadas "Hot Keys". En este sería "Control + C", pero como ya comentaba antes, no es cómodo para el usuario tener que conocer estos métodos, es por eso que haremos el siguiente control para poder hacer esta tarea con el típico clic del botón derecho de nuestro ratón.
Lo primero será crea un control, que hereda de "Text box" y ahí gestionar todos los eventos y propiedades del control, el código será el siguiente:
namespace Silverlight.Common.Controls{
public
class
TextBoxWithCopyControl : TextBox {
ContextMenu menu = null;
MenuItem item;
public TextBoxWithCopyControl(){
this.MouseRightButtonDown += new
MouseButtonEventHandler(TextBoxWithCopyControlMouseRightButtonDown);
this.MouseRightButtonUp += new
MouseButtonEventHandler(TextBoxWithCopyControlMouseRightButtonUp);
}
void TextBoxWithCopyControlMouseRightButtonUp(object sender, MouseButtonEventArgs e) {
menu = new
ContextMenu();
item = new
MenuItem();
item.Header = "Copiar";
menu.Items.Add(item);
item.Click += new
RoutedEventHandler(item_Click);
menu.IsOpen = true;
menu.HorizontalOffset = e.GetPosition(null).X;
menu.VerticalOffset = e.GetPosition(null).Y;
}
static
void TextBoxWithCopyControlMouseRightButtonDown(object sender, MouseButtonEventArgs e) {
e.Handled = true;
}
void item_Click(object sender, RoutedEventArgs e){
Clipboard.SetText(this.Text);
}
}
}
Después de crear el control, tenemos que crear un estilo, ya que al heredar de "TextBox" la presentación en pantalla puede no ser la esperada, por ello creamos el siguiente estilo.
<Style x:Key="SelectableTextBoxStyle" TargetType="TextBox">
<Setter Property="IsReadOnly" Value="true"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Grid x:Name="RootElement">
<ScrollViewer x:Name="ContentElement" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" BorderThickness="0"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Ahora solo nos queda aplicar el control a esos textos que queremos darle esta propiedad, dejo aquí un ejemplo:
<Controls:TextBoxWithCopyControl x:Name="txtDescription" TextWrapping="Wrap" Style="{StaticResource SelectableTextBoxStyle}" HorizontalAlignment="Left" FontSize="21.333" Foreground="#FF1F1F1F" FontWeight="Bold" FontFamily="Tahoma" Width="365" Text="{Binding Question.Description, Mode=OneWay}" Margin="4" />
Ahora podemos seleccionar texto y al pulsar botón derecho, nos permitirá copiarlo.