Выделение любого текста в GUI Silverlight и WPF



Задача сделать пользовательский интерфейс, в котором, как в браузере можно выделять любой текст.
Другими словами, чтоб любой текст на экране можно было выделить, а не талько в элементах для ввода текста.

В WPF для этого используется немного настроенный TextBox со свойством IsReadOnly=”true”
Используется следующий стиль
<Style x:Key="Texted" TargetType="TextBox">
<Setter Property="IsReadOnly" Value="True" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="IsTabStop" Value="False" />
</Style>


В Silverlight 3 этот фокус теперь не пройдет, тк появилось закрашивание серым цветом если IsReadOnly=”true”
Решается это следующим кастомным стилем (например разместите его в App.xaml в ResourceDictionary)
<Style x:Key="OnlySelectedTextBox" TargetType="TextBox">
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="#FF000000"/>
<Setter Property="Padding" Value="2"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Grid x:Name="RootElement">
<Border x:Name="Border" Opacity="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1">
<ScrollViewer x:Name="ContentElement" BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}"/>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>


Далее можете на любой странице применять следующее
<TextBox Text="LaLa:" Style="{StaticResource OnlySelectedTextBox}"/>

Замечание!
Я немного сильно доработал шаблон контрола в этом стиле. Если вам нужно что-то более нежное с сохранением всего функционала TextBox, то используйте вот это preventing greyed-out effect when TextBox.IsReadOnly = true
Там говориться, что надо подправить полностью содрать через Expression Blend 3 стиль TextBox, задать ему имя, и поменять одну строчку в стиле, отвечающую за закрашивание
<Border x:Name="ReadOnlyVisualElement" Opacity="0" Background="#5EC9C9C9"/>
на
<Border x:Name="ReadOnlyVisualElement" Opacity="0"/>
Далее можно использовать как у меня <TextBox Text="LaLa:" Style="{StaticResource MyTextBoxStyle}"/>

Комментарии

Популярные сообщения из этого блога

A4tech. Мышь не найдена. Пожалуйста, подсоедините мышь.

Как экспортировать контакты из iPhone

The type or namespace name 'IISOle' could not be found (are you missing a using directive or an assembly reference?)