2015-08-14 3 views
7

Я создал текстовое поле пользовательской воды, которое расширилось из текстового поля. шаблон управления для этого показан ниже.Текстовый блок иногда отсутствует курсор

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type controls:WaterMarkTextBox}"> 
      <ControlTemplate.Resources> 
       <Storyboard x:Key="Storyboard1"> 
        <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" 
                 Storyboard.TargetName="PART_FieldTextBlock"> 
         <SplineThicknessKeyFrame KeyTime="0:0:0.15" 
               Value="0,0,10,0" /> 
        </ThicknessAnimationUsingKeyFrames> 
       </Storyboard> 
       <Storyboard x:Key="Storyboard2"> 
        <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" 
                 Storyboard.TargetName="PART_FieldTextBlock"> 
         <SplineThicknessKeyFrame KeyTime="0:0:0.25" 
               Value="0,0,-500,0" /> 
        </ThicknessAnimationUsingKeyFrames> 
       </Storyboard> 
      </ControlTemplate.Resources> 
      <Grid x:Name="PART_GridControl" 
        ClipToBounds="True" 
        Height="{TemplateBinding Height}" 
        Width="{TemplateBinding Width}"> 
       <TextBlock x:Name="PART_PlaceHolderTextBlock" 
          Style="{StaticResource SWMLightTextBlockStyle}" 
          Foreground="#BDBBBB" 
          FontSize="{StaticResource SmallFontSize}" 
          Text="{TemplateBinding PlaceHolderText}" 
          VerticalAlignment="Center" 
          Margin="20,0,10,0" /> 
       <Border Name="border" 
         CornerRadius="0" 
         Padding="2" 
         BorderThickness="1" 
         BorderBrush="DeepSkyBlue"> 
        <ScrollViewer x:Name="PART_ContentHost"/> 
       </Border> 
       <TextBlock x:Name="PART_FieldTextBlock" 
          HorizontalAlignment="Right" 
          Foreground="#BDBBBB" 
          Margin="0,0,-500,0" 
          Style="{StaticResource SWMLightTextBlockStyle}" 
          FontSize="{StaticResource SmallFontSize}" 
          TextWrapping="Wrap" 
          Text="{TemplateBinding FieldText}" 
          VerticalAlignment="Center" /> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

, но при вводе текстового поля переходит в состояние, в котором оно не имея никакого курсора, но мы можем ввести в это происходит с вероятностью 1/2 chars.I интересно, как это происходит. Кто-нибудь знает, как это происходит?

ответ

0

Две вещи, которые вы можете сделать. Первый Переопределение SystemParameters Свойства Использование отражения Понравился

void LocallyDisableMouseVanish() 
    { 
     foreach (var field in typeof(SystemParameters).GetFields(BindingFlags.NonPublic|BindingFlags.Static)) 
      if (field.Name.Contains("mouseVanish")) 
       field.SetValue(null, false); 
    } 

вызвать этот метод фокус вашего контроля.

Если это не работает означает, что Вы можете попробовать что-то подобное Переопределить стиль каретка Как это

<Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type controls:WaterMarkTextBox}"> 
       <ControlTemplate.Resources> 
        <Storyboard x:Key="Storyboard1"> 
         <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" 
                  Storyboard.TargetName="PART_FieldTextBlock"> 
          <SplineThicknessKeyFrame KeyTime="0:0:0.15" 
                Value="0,0,10,0" /> 
         </ThicknessAnimationUsingKeyFrames> 
        </Storyboard> 
        <Storyboard x:Key="Storyboard2"> 
         <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" 
                  Storyboard.TargetName="PART_FieldTextBlock"> 
          <SplineThicknessKeyFrame KeyTime="0:0:0.25" 
                Value="0,0,-500,0" /> 
         </ThicknessAnimationUsingKeyFrames> 
        </Storyboard> 
       </ControlTemplate.Resources> 
       <Grid x:Name="PART_GridControl" 
         ClipToBounds="True" 
         Height="{TemplateBinding Height}" 
         Width="{TemplateBinding Width}"> 
        <TextBlock x:Name="PART_PlaceHolderTextBlock" 
           Style="{StaticResource SWMLightTextBlockStyle}" 
           Foreground="#BDBBBB" 
           FontSize="{StaticResource SmallFontSize}" 
           Text="{TemplateBinding PlaceHolderText}" 
           VerticalAlignment="Center" 
           Margin="20,0,10,0" /> 
        <Border Name="border" 
          CornerRadius="0" 
          Padding="2" 
          BorderThickness="1" 
          BorderBrush="DeepSkyBlue"> 
         <ScrollViewer x:Name="PART_ContentHost" /> 
        </Border> 
        <TextBlock x:Name="PART_FieldTextBlock" 
           HorizontalAlignment="Right" 
           Foreground="#BDBBBB" 
           Margin="0,0,-500,0" 
           Style="{StaticResource SWMLightTextBlockStyle}" 
           FontSize="{StaticResource SmallFontSize}" 
           TextWrapping="Wrap" 
           Text="{TemplateBinding FieldText}" 
           VerticalAlignment="Center" /> 
        <Canvas> 
         <Border x:Name="PART_Caret" 
           Visibility="Collapsed" 
           Canvas.Left="0" 
           Canvas.Top="0" 
           Width="5" 
           Height="25" 
           Background="Black" 
           BorderThickness="1"> 
          <Border.Triggers> 
           <EventTrigger RoutedEvent="Border.Loaded"> 
            <BeginStoryboard> 
             <Storyboard x:Name="CaretStoryBoard" 
                RepeatBehavior="Forever"> 
              <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Background.Color" 
                      Duration="0:0:0:1" 
                      FillBehavior="HoldEnd"> 
               <ColorAnimationUsingKeyFrames.KeyFrames> 
                <DiscreteColorKeyFrame KeyTime="0:0:0.750" 
                      Value="Transparent" /> 
                <DiscreteColorKeyFrame KeyTime="0:0:0.000" 
                      Value="Black" /> 
               </ColorAnimationUsingKeyFrames.KeyFrames> 
              </ColorAnimationUsingKeyFrames> 
             </Storyboard> 
            </BeginStoryboard> 
           </EventTrigger> 
          </Border.Triggers> 
         </Border> 
        </Canvas> 
       </Grid> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="CaretBrush " 
      Value="Transparent" /> 

И в вашем коде управления Добавить

public override void OnApplyTemplate() 
    { 
     this.border = this.GetTemplateChild("PART_Caret") as Border; 
     base.OnApplyTemplate(); 
    } 

И добавить этот метод

private void MoveCustomCaret() 
    { 
     var caretLocation = this.GetRectFromCharacterIndex(this.CaretIndex).Location; 

     if (!double.IsInfinity(caretLocation.X)) 
     { 
      Canvas.SetLeft(border, caretLocation.X); 
     } 

     if (!double.IsInfinity(caretLocation.Y)) 
     { 
      Canvas.SetTop(border, caretLocation.Y); 
     } 
    } 

И, наконец, назовите этот метод и установите видимость границы

private void SWMTextBox_GotFocus(object sender, RoutedEventArgs e) 
    { 
     MoveCustomCaret(); 
     border.Visibility = Visibility.Visible; 
    } 

также в TextChangedEvent

private void CustomTextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     MoveCustomCaret(); 
    } 

и спрятался видимостью в Lost_Focus_Event

private void SWMTextBox_LostFocus(object sender, RoutedEventArgs e) 
    { 
     border.Visibility = Visibility.Hidden; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^