我创建了一个自定义水印文本框,从文本框扩展.其控制模板如下所示.
<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,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,-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" />
                <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"
                           Style="{StaticResource SWMLightTextBlockStyle}"
                           FontSize="{StaticResource SmallFontSize}"
                           textwrapping="Wrap"
                           Text="{TemplateBinding FieldText}"
                           VerticalAlignment="Center" />
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

但是当输入文本框进入一个没有光标的情况但是我们可以输入它的概率是1/2字符.我想知道它是如何发生的.任何人都知道它是如何发生的?

解决方法

你可以做两件事.第一个是覆盖SystemParameters属性使用反射像这样
void LocallydisableMouseVanish()
    {
        foreach (var field in typeof(SystemParameters).GetFields(BindingFlags.NonPublic|BindingFlags.Static))
            if (field.Name.Contains("mouseVanish"))
                field.SetValue(null,false);
    }

在您的控制焦点上调用此方法.

如果这不起作用意味着你可以试试这样的东西覆盖Caret的风格就像这样

<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" />
                        </ThicknessAnimationUsingKeyFrames>
                    </Storyboard>
                    <Storyboard x:Key="Storyboard2">
                        <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)"
                                                          Storyboard.TargetName="PART_FieldTextBlock">
                            <SplineThicknessKeyFrame KeyTime="0:0:0.25"
                                                     Value="0,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" />
                    <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"
                               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;
    }

c# – 文本框有时会丢失光标的更多相关文章

  1. 使用placeholder属性设置input文本框的提示信息

    这篇文章主要介绍了使用placeholder属性设置input文本框的提示信息,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 在新的Storyboard中将值传递给UIViewController – Swift

    我试图将值传递给新的视图控制器–位于新的故事板文件中.但是当我这样做时,我从NewViewController得到的结果总是为零.下面是我在新故事板中显示视图控制器的方法:我尝试在这里发送信息:然后呈现视图控制器.这是我的NewViewController,我尝试接收值.但最终仍然是零.我错误地发送了这些值吗?解决方法您正在使用此行创建NewViewController的新实例而是将变量和委托分配给已从StoryBoard实例化的vc

  3. ios – 将UIViewController视图属性设置为不带有storyboard / nib的自定义UIView类

    或者上面的代码片段是推荐的吗?

  4. ios – Xcode Storyboard中“推断”和“自由形式”有什么区别?

    我有一个自定义视图,需要在所有iPhone设备上显示.在创建自定义视图XIB时,我将其称为“推断”,但它没有为iPhone6和iPhone6Plus设备调整大小.我无法弄清楚这个问题.我对“推断”和“自由形式”之间的实际差异感到困惑.有人可以解释一下这些差异吗?

  5. 在ios中将故事板从一个应用程序复制到另一个应用程序的最佳方法是什么?

    或者我在这里遗漏了什么?编辑-1我认为StoryBoard的布局大小仅限于iphone5.解决方法你这样做的方式是正确的.您只是遇到了布局约束不存在或错误的事实.关于故事板没有什么神奇之处……它只是一个像你复制到你的新项目中的任何其他文件.您应该在每个视图控制器中选择您的顶层视图,然后告诉Xcode删除所有约束并将它们重置为建议的约束,然后从那里开始.

  6. ios – Interface Builder无法确定“Main.storyboard”的类型.这可能是由于缺少SDK

    解决方法这没有你想象的那么复杂.该错误是因为您在Main.storyboard的源代码上输错了一些内容,例如我不小心在Main.storyboard的第一个打开标记之前放了一个“”.1)你必须做的是删除Main.storyboard2)转到垃圾箱,将Main.storyboard移动到桌面,用任何文本编辑器打开并修复代码;然后“全选”和“复制”.3)在Xcode上,创建一个全新的Main.storyboard,然后按右键单击文件并选择OpenAs–>源代码,然后粘贴您在剪贴板上的固定代码.4)右键单击文件

  7. 使用Xcode 6中的Storyboard的AppDelegate for Cocoa应用程序

    我有一个现有的OSX应用程序,在转换为Storyboards作为主界面后,我的app代理不再被使用.之前,MainMenu.xib有一个“AppDelegate”对象,我可以将它的类设置为我的appdelegate.但是,Storyboard不包含此类对象.如何恢复AppDelegate并保留故事板?

  8. ios – storyboard在导入xcassets后为每个图像都有问号

    图片.这是在我将所有媒体资产导入新的.xcassets结构后发生的.该应用程序运行正常,图像显示应用程序运行时,但我该怎么做才能在故事板中恢复它们?解决方法从故事板中的图像名称中删除.png扩展名.Xcode5现在使用图像名称,而不是文件名.

  9. xcode – 使用Storyboard参考AppDelegate中的主要NSWindow?

    我正在尝试在AppDelegate中为我的应用程序的主窗口设置一个插座,然后在InterfaceBuilder中连接它.我轻松地在AppDelegate中创建插座:但是,在界面构建器中,我无法将引用插座连接到AppDelegate.相反,我只能将它连接到WindowController,我希望这张图片显示:第一个对象是WindowController,第二个对象是FirstResponder,但缺

  10. 将数据从一个视图控制器传递到另一个; iOS &lt;= 4 vs iOS 5

    只是使用id并谨慎对待风?

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部