Выделение любого текста в 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}"/>
Комментарии
Отправить комментарий