Какой самый простой способ убрать границу при наведении курсора мыши Silverlight TextBox?
Я хочу отобразить текст в приложении Silverlight, чтобы пользователь мог копировать и вставлять его в другое место (как это обычно делают на веб-сайте HTML).
Если я использую TextBlock, то пользователь не может копировать и вставлять.
Поэтому я использую TextBox, но у него есть граница по умолчанию. Я могу удалить границу с BorderThickness="0"
как это:
<TextBox
Grid.Column="1"
BorderThickness="0"
Text="{Binding ViewModelBindingStringsBlockHelp}"/>
который прекрасно работает:
http://www.deviantsart.com/upload/45p34i.png
Однако когда пользователь наводит курсор на текстовое поле, чтобы выделить текст, появляется другая граница:
http://www.deviantsart.com/upload/1k7m44p.png
Я нашел предполагаемые решения для удаления этой границы, но они невероятно, кажется, требуют страниц XAML.
Я ищу простое решение, как это:
HoverBorderThickness="0"
Какой простой способ скрыть границу при наведении на текстовом поле Silverlight?
6 ответов
К сожалению, вы столкнулись с желанием сделать что-то, что в совокупности кажется относительно простым, но вы должны перепрыгнуть через несколько обручей, чтобы сделать это. Как уже упоминалось в предыдущих ответах, вам нужно будет переустановить / обновить текстовое поле как есть.
Что касается состояния наведения - это относительно большая точка Silverlight, с которой вам следует разобраться, - это идея, что каждый элемент управления имеет отдельные состояния.
Expression Blend - отличный способ справиться с этими состояниями - вы можете легко увидеть, что представляют собой встроенные шаблоны и стили XAML, и редактировать их на лету с минимальными усилиями. Иногда это может быть непросто, и это, черт возьми, делает ваш XAML немного громоздким, но это стоимость, которую вы тратите на создание элемента управления, выполняющего именно то, что вы хотите, и когда вы этого хотите.
Используйте силу состояний, особенно в Blend, и я гарантирую, что вы поймете, насколько проще может стать ваша жизнь.
Это мое решение для создания текстового поля только для чтения без фона и границ:
public class MyTextBox : TextBox
{
private String readOnlyText;
public String ReadOnlyText
{
get
{
return readOnlyText;
}
set
{
readOnlyText = value;
this.Text = readOnlyText;
}
}
public MyTextBox()
{
BorderThickness = new Thickness(0);
Background = new SolidColorBrush(Color.FromArgb(0, 255, 255, 255));
BorderBrush = new SolidColorBrush(Color.FromArgb(0, 255, 255, 255));
this.TextWrapping = System.Windows.TextWrapping.Wrap;
this.GotFocus += new RoutedEventHandler(MyTextBox_GotFocus);
this.MouseEnter += new MouseEventHandler(MyTextBox_MouseEnter);
this.MouseMove += new MouseEventHandler(MyTextBox_MouseMove);
this.TextChanged += new TextChangedEventHandler(MyTextBox_TextChanged);
}
void MyTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (!string.IsNullOrEmpty(this.ReadOnlyText))
{
var lS = this.SelectionStart; var lL = this.SelectionLength;
this.Text = this.ReadOnlyText;
this.SelectionStart = lS; this.SelectionLength = lL;
}
}
void MyTextBox_MouseMove(object sender, MouseEventArgs e)
{
VisualStateManager.GoToState(this, "Normal", false);
}
void MyTextBox_MouseEnter(object sender, MouseEventArgs e)
{
VisualStateManager.GoToState(this, "Normal", false);
}
void MyTextBox_GotFocus(object sender, RoutedEventArgs e)
{
VisualStateManager.GoToState(this, "Normal", false);
}
}
К сожалению, вам нужно повторно шаблон. Использование Blend сделает это проще, чем ручное редактирование.
Просто примените этот стиль к вашему текстовому полю. Это единственный способ сделать это.
<Style x:Key="TextBoxStyle1" TargetType="TextBox">
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Background" Value="#FFFFFFFF"/>
<Setter Property="Foreground" Value="#FF000000"/>
<Setter Property="Padding" Value="2"/>
<Setter Property="BorderBrush">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFA3AEB9" Offset="0"/>
<GradientStop Color="#FF8399A9" Offset="0.375"/>
<GradientStop Color="#FF718597" Offset="0.375"/>
<GradientStop Color="#FF617584" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Grid x:Name="RootElement">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement"/>
</Storyboard>
</VisualState>
<VisualState x:Name="ReadOnly">
<Storyboard>
<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ReadOnlyVisualElement"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="FocusStates">
<VisualState x:Name="Focused">
</VisualState>
<VisualState x:Name="Unfocused">
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="ValidationStates">
<VisualState x:Name="Valid"/>
<VisualState x:Name="InvalidUnfocused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="InvalidFocused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<System:Boolean>True</System:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid>
<Border x:Name="ReadOnlyVisualElement" Background="#5EC9C9C9" Opacity="0"/>
<Border x:Name="MouseOverBorder" BorderBrush="Transparent" BorderThickness="1">
<ScrollViewer x:Name="ContentElement" BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}"/>
</Border>
</Grid>
<Border x:Name="DisabledVisualElement" BorderBrush="#A5F7F7F7" BorderThickness="{TemplateBinding BorderThickness}" Background="#A5F7F7F7" IsHitTestVisible="False" Opacity="0"/>
<Border x:Name="ValidationErrorElement" BorderBrush="#FFDB000C" BorderThickness="1" CornerRadius="1" Visibility="Collapsed">
<ToolTipService.ToolTip>
<ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" >
<ToolTip.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<System:Boolean>true</System:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ToolTip.Triggers>
</ToolTip>
</ToolTipService.ToolTip>
<Grid Background="Transparent" HorizontalAlignment="Right" Height="12" Margin="1,-4,-4,0" VerticalAlignment="Top" Width="12">
<Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C" Margin="1,3,0,0"/>
<Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff" Margin="1,3,0,0"/>
</Grid>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
То, что вы видите, это элемент Focus. Это часть шаблона по умолчанию для текстовых полей. Создание собственного шаблона - лучший способ получить контроль над стилем вашего элемента. Просто удалите основную границу и границу элемента фокуса, и все будет хорошо. Тогда вам больше не нужно будет указывать толщину границы в XAML.