Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

вторник, 22 сентября 2009 г.

Выделение любого текста в 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}"/>

Комментариев нет:

Отправить комментарий