Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Text Box sometimes cursor is missing

I have created a custom water mark text box which is extended from text box. control template for the same is shown below.

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

but while typing the textbox enters to a condition where it is having no cursor but we can type into it occurs with a probability of 1/2 chars.I wonder how it happens. Anyone is having idea how it is happening?

like image 704
Alias Varghese Avatar asked Aug 14 '15 08:08

Alias Varghese


1 Answers

Two things You can do. First One is Overriding SystemParameters Properties Using reflection Like this

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

Call this method On Focus Of your Control.

If this is Not working means You can Try something Like this Override the style of the Caret Like this

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

And in your control code Add this

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

And add this Method

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

And Finally Call This method and set the visibility of the border

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

also in TextChangedEvent

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

And Hid the Visibility in Lost_Focus_Event

private void SWMTextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        border.Visibility = Visibility.Hidden;
    }
like image 132
Dinesh balan Avatar answered Nov 14 '22 23:11

Dinesh balan