【问题标题】:Text Box sometimes cursor is missing文本框有时光标丢失
【发布时间】:2015-08-14 08:36:46
【问题描述】:

我创建了一个从文本框扩展而来的自定义水印文本框。相同的控制模板如下所示。

<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 个字符。我想知道它是如何发生的。有人知道它是如何发生的吗?

【问题讨论】:

    标签: c# wpf xaml textbox controltemplate


    【解决方案1】:

    你可以做两件事。第一个是像这样使用反射覆盖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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 2016-05-07
      • 1970-01-01
      • 2011-03-01
      • 2013-01-31
      • 1970-01-01
      相关资源
      最近更新 更多