2015-08-14 15 views
7

Ich habe eine benutzerdefinierte Wasserzeichen-Textfeld erstellt, die aus Textfeld erweitert wird. Kontrollschablone für das gleiche ist unten gezeigt.Textfeld manchmal Cursor fehlt

<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> 

aber während der Eingabe das Textfeld in einen Zustand eintritt, in dem es keinen Cursor mit, aber wir können geben Sie in es mit einer Wahrscheinlichkeit von 1/2 chars.I auftritt fragen, wie es geschieht. Jeder hat eine Idee, wie es passiert?

Antwort

0

Zwei Dinge, die Sie tun können. Erstens ist ein Aufschalten SystemParameters Eigenschaften Mit Reflexion Gefällt Ihnen dieses

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

Rufen Sie diese Methode auf Fokus Ihrer Kontrolle.

Wenn dies nicht funktioniert, bedeutet, dass Sie so etwas wie dies der Stil des Caret außer Kraft setzen können versuchen, dieses Wie

<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" /> 

Und in Ihrem Steuercode Dieses

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

und fügen Sie diese Methode

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); 
     } 
    } 

Und schließlich Call Diese Methode und setzen Sie die Sichtbarkeit der Grenze

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

auch in TextChangedEvent

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

und barg die Sichtbarkeit in Lost_Focus_Event

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