Какой самый простой способ убрать границу при наведении курсора мыши Silverlight TextBox? - PullRequest
2 голосов
/ 23 мая 2010

Я хочу отобразить текст в приложении 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 ]

5 голосов
/ 24 мая 2010

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

Что касается состояния наведения - это относительно большая точка Silverlight, с которой вам следует разобраться - это идея, что каждый элемент управления имеет отдельные состояния .

Expression Blend - отличный способ справиться с этими состояниями - вы можете легко увидеть, что представляют собой встроенные шаблоны и стили XAML, и редактировать их на лету с минимальными усилиями.Иногда это может быть непросто, и это, черт возьми, делает ваш XAML немного громоздким, но это та стоимость, которую вы тратите на создание элемента управления , выполняющего в точности то, что вы хотите, когда вам этого хочется.*

Используйте силу состояний, особенно в Blend, и я гарантирую, что вы поймете, насколько проще ваша жизнь.

2 голосов
/ 13 декабря 2011

Это мое решение для создания текстового поля только для чтения без фона и границ:

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);
    }
}
1 голос
/ 19 октября 2011

Установите для свойства Readonly значение true

1 голос
/ 24 мая 2010

Просто примените этот стиль к вашему текстовому полю.Это единственный способ сделать это.

<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>
1 голос
/ 24 мая 2010

К сожалению, вам нужно повторно шаблон. Использование Blend сделает это проще, чем ручное редактирование.

0 голосов
/ 24 мая 2010

То, что вы видите, это элемент Focus. Это часть шаблона по умолчанию для текстовых полей. Создание собственного шаблона - лучший способ получить контроль над стилем вашего элемента. Просто удалите основную границу и границу элемента фокуса, и все будет хорошо. Тогда вам больше не нужно будет устанавливать толщину границ в XAML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...