ViewBox 内的 WPF TextBox 在调整大小时丢失光标

2023-12-11

我在视图框中有一个文本框。当我尝试调整窗口大小时,文本框大小和字体大小会缩放,但如果我尝试聚焦文本框并尝试使用键盘在文本框中移动光标,有时光标会消失。有没有办法始终显示光标?请参考下面的代码,其中 ViewBox 内有一个 TextBox。

<Window x:Class="Resolution_Learning.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow">
<Viewbox Stretch="Uniform">
    <Grid Width="2560" Height="1440" >
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Content="Hello"/>
        <TextBox  Grid.Row="0" Grid.Column="1"></TextBox>
        <Label Grid.Row="0" Grid.Column="2" Content="Hello"/>
        <TextBox Grid.Row="0" Grid.Column="3"/>
        <Label Grid.Row="1" Grid.Column="0" Content="Hello"/>
        <TextBox Grid.Row="1" Grid.Column="1"/>
        <Label Grid.Row="1" Grid.Column="2" Content="Hello"/>
        <TextBox Grid.Row="1" Grid.Column="3"/>
    </Grid>
</Viewbox>

It's a BUG in WPF。我通过创造自己的风格来实现这一点TextBox Caret.

XAML: Style for TextBox

<Style TargetType="{x:Type TextBox}" x:Key="CaretStyle" >
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Canvas>                                    
                                <TextBox x:Name="Box" CaretBrush="Transparent"  Width="{Binding RelativeSource={RelativeSource AncestorType=TextBox},Path=ActualWidth,Mode=OneWay}" 
                                          Height="{Binding RelativeSource={RelativeSource AncestorType=TextBox},Path=ActualHeight,Mode=OneWay}"/>
                                <Border x:Name="Caret" 
                                    Visibility="Collapsed"
                                    Canvas.Left="0" Canvas.Top="0" Margin="0" Padding="0"
                                    Width="1"  Height="16"  Background="Black">                                        
                                    <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>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <EventSetter Event="SelectionChanged" Handler="CustomTextBox_SelectionChanged"/>
                <EventSetter Event="GotFocus" Handler="CustomTextBox_GotFocus" />
                <EventSetter Event="LostFocus" Handler="CustomTextBox_LostFocus" />
            </Style>

EVENTS: For Caret Position

 void CustomTextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        var Caret = FindChild<Border>(sender as DependencyObject, "Caret");
        Caret.Visibility = Visibility.Collapsed;
    }

    void CustomTextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        var Caret = FindChild<Border>(sender as DependencyObject, "Caret");
        Caret.Visibility = Visibility.Visible;
    }

    void CustomTextBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        var CustomTextBox = FindChild<TextBox>(sender as DependencyObject, "Box");
        var caretLocation = CustomTextBox.GetRectFromCharacterIndex(CustomTextBox.CaretIndex).Location;
        var Caret = FindChild<Border>(sender as DependencyObject, "Caret");
        if (!double.IsInfinity(caretLocation.X))
        {
            Canvas.SetLeft(Caret, caretLocation.X);
        }

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

辅助方法: To Get Visual Child

     public static T FindChild<T>(DependencyObject parent, string childName)
   where T : DependencyObject
        {
            // Confirm parent and childName are valid. 
            if (parent == null) return null;

            T foundChild = null;

            int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                // If the child is not of the request child type child
                T childType = child as T;
                if (childType == null)
                {
                    // recursively drill down the tree
                    foundChild = FindChild<T>(child, childName);

                    // If the child is found, break so we do not overwrite the found child. 
                    if (foundChild != null) break;
                }
                else if (!string.IsNullOrEmpty(childName))
                {
                    var frameworkElement = child as FrameworkElement;
                    // If the child's name is set for search
                    if (frameworkElement != null && frameworkElement.Name == childName)
                    {
                        // if the child's name is of the request name
                        foundChild = (T)child;
                        break;
                    }
                }
                else
                {
                    // child element found.
                    foundChild = (T)child;
                    break;
                }
            }

            return foundChild;
        }

只需添加上面即可Style/metods在你的代码中并设置Style for TextBoxes无论您想要什么,都可以看到结果。正如我所创造的 这是我自己没有实际测量的Caret symbol,您可能会看到一定比例的浅色阴影。请调整 根据需要的外观和感觉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ViewBox 内的 WPF TextBox 在调整大小时丢失光标 的相关文章

  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • WPF:使用 StringFormat={}{0:F2} 进行文本框绑定。不显示零

    我使用以下 XAML 将对象绑定到 TextBox
  • 带有命令绑定的 KeyBinding 不适用于 TextBox UpdateSourceTrigger LostFocus

    我正在使用 MVVM 并遇到以下问题 我的 TextBox Text 与 UpdateSourceTrigger LostFocus 绑定 这就是用户想要的 我有一个带有 SaveCommand CommandBinding 的按钮 这有效
  • 如何使用DocumentViewer显示流程文档?

    我的资源中有一个简单的流程文档 FlowDocument1 xaml
  • 不支持 URI 前缀

    我正在尝试使用以下方法加载和播放波形文件 SoundPlayer simpleSound new SoundPlayer pack application MyAssembly component Sounds 10meters wav s
  • WPF 中处理系统关闭

    如何在 WPF 中重写 WndProc 当我的窗口关闭时 我尝试检查我正在使用的文件是否被修改 如果是 我必须提示用户 你想保存更改吗 消息 然后关闭正在使用的文件和窗口 但是 当我的窗口仍然打开时 我无法处理用户重新启动 关闭 注销的情况
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何从WPF中的另一个窗口调用方法

    我有两个窗户win1用于显示用户列表和其他win2用于添加用户 我还有一种在删除 更新或添加用户后刷新网格的方法 这个方法是在win1 我如何调用这个方法win2添加用户后 这是一个非常基本的面向对象设计问题 所以您希望能够从win2到一个
  • 在包含按钮的ListView中,如何获取单击按钮的索引?

    我有一个ListView仅包含按钮 我想做的很简单 我想要获得已单击按钮的索引 列表的计数从0到100不等 因此当用户单击按钮6时 我需要这个数字进行处理 我定义了我的ListView像这样
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将
  • 从固定文档中删除页面?

    如何从固定文档中删除页面 我添加这样的页面 Add page to pageContent PageContent pageContent new PageContent IAddChild pageContent AddChild fix
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • WPF画布性能-children.add调用多次

    我在长画布上绘制了很多线条 想想条形图 并对其性能进行了相当好的调整 使用低级几何类并冻结它们等 这极大地提高了性能 但仍然需要几秒钟将几千个项目加载到画布中 我对应用程序进行了性能分析 看起来每次调用都花费了很大一部分时间canvas c
  • 当其他列子项折叠时调整 WPF 网格列的大小?

    我有两个控件Grid 并且需要制作一个来填充所有Grid另一个获得后的空间Collapseded 我不知道什么Container我可以使用吗 我试过了StackPanel and DockPanel我也是 但找不到好的解决方案 这是我的代码
  • 绑定导致 StackOverflow

    我不确定我在这里做错了什么 可以说 我有两个用户控件BoxAand BoxB 两者都有一个名为的 DependencyPropertyText BoxB 包装了具有常规 TextBox 的 BoxA 绑定应该像这样 BoxB Text Bo
  • 异步WCF调用来保存线程?

    In 另一个问题 https stackoverflow com q 19731600 279516 建议我发送异步网络请求 而不是在后台线程上发送同步请求 原因是为了不浪费一根线 我试图理解这是怎么回事 这是最初的做法 我可以理解这里怎么
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • C# asp.net中WebForm中Winform的Textbox.KeyDown的交替事件是什么?

    在 WinForms 应用程序中 我可以有一个textbox1 keydown事件 但我想在 WebForm ASP NET 中实现同样的事情 那么我该怎么做呢 我需要从数据库中检索有关此事件的数据 您可以使用 onkeydown 事件 然
  • 如何从 XAML 设置 WPF 用户控件属性?

    我试图从 XAML 设置同一用户控件的多个实例的 fill 属性 以便区分它们 我在控件的 C 代码隐藏中使用依赖属性 并在实例化控件时在 XAML 中引用该属性 这是我尝试过的简化示例 首先是用户控件的 XAML

随机推荐

  • 将数组元素从一个数组位置移动到另一个数组位置

    我很难弄清楚如何移动数组的元素 例如 给定以下情况 var array a b c d e 如何编写一个函数来移动元素 d 到左侧 b Or a 在 的右边 c 移动元素后 应更新其余元素的索引 结果数组将是 array a d b c e
  • 阻止访问 ASP.NET - MVC 应用程序的静态内容

    我们有 asp net MVC 和角度应用程序 我们使用 Identityserver3 来控制应用程序的访问 除了一件事之外 一切都按预期进行 未经授权的用户仍然可以访问应用程序的静态内容 有没有办法在用户登录之前拒绝访问这些文件 这是一
  • 从客户端(iOS 和 Android)发送 Socket 请求到 Sails.js 服务器

    我正在尝试将 socket io 与 iOS 和 Android 应用程序一起使用 但这里存在一些问题 我想问一下是否有人真正有解决方案 如何从客户端 iOS Android 发送socket io请求 我认为有适用于iOS和Android
  • web2py 网址验证器

    在 web2by 构建的缩短器中 我想首先验证 url 如果无效 则返回到第一页并显示错误消息 这是我在控制器 mvc arch 中的代码 但我不明白出了什么问题 import urllib def index return dict de
  • Woocommerce 变体产品价格显示默认值

    我的商店设置了产品变体 目前在产品缩略图页面 即类别和过滤页面 上显示 从 xx 到 xx 当进入单个产品页面时 变体被选择为变体价格显示 我将某些属性设置为默认值 这是我希望在类别页面上显示的价格 标准尺寸和成本 但我不知道是否可能或将其
  • Python 错误:“ValueError:需要超过 1 个值才能解压”

    在 Python 中 当我运行这段代码时 from sys import argv script user name argv prompt gt print Hi s I m the s script user name script 我
  • 将单选按钮值插入 mysql

    我创建了一个测试表单只是为了尝试将我的单选按钮值发送到 mysql 我现在遇到了问题 下面的代码只是一个测试 我希望单选按钮提交该值 但事实并非如此 table width 300 border 0 align center cellpad
  • Flutter/Dart 中的 SOAP 请求

    我需要使用 Flutter 向 NET Webservice WSDL 发出 SOAP 请求 该网络服务有一个基本的身份验证 用户 密码 和一些带有预定义信封的服务 所以我尝试创建一个 SOAP 信封 String requestBody
  • 多次购买时会发生什么 - 非续订订阅应用内购买

    我正在实现一个包含应用内购买功能的示例 订阅是非续订类型 自动续费订阅时 如果用户已经购买过 且在有效期内再次尝试购买 iTunes会提示 您已经订阅了购买 并且不会进一步进行 用户可以使用应用程序恢复功能恢复其订阅 但对于非续订订阅类型
  • 是否可以在 FullCalendar 中交替行背景颜色?

    我对 fc agenda slot tr 应用了奇数 偶数类 但问题是左 右 单元格 边框位于下面的 fc agenda days 表上 因此当我设置背景时它不会显示在 fc agenda slot tr 上 FullCalendar 本身
  • CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?

    我已经能够使用 CakePHP 的 saveAll 方法同时创建 成员 并将它们注册到 事件 中 创建 HABTM 链接记录 这非常棒 例如 此代码创建两个新的 Members 并将每个人的记录添加到 EventsMember 表中 将它们
  • Android 数字选择器对话框 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有人有任何对话框允许用户选择一定范围内的数字 这似乎是一个相当普遍的需求 但我找不到它的通用对话框 而且我不想花时间创建自己的对话框 有什么帮助吗 我知道两年多过去了 但答案仍然
  • ruby 如何允许方法和类同名?

    我碰巧正在用 ruby 开发 Singleton 类 只记得它的工作方式工厂女工 他们解决了这个问题 所以你可以同时使用漫长的路 Factory create and 捷径 Factory 我想了想 很好奇他们是如何上课的Factory也表
  • Cygwin编码困难

    不确定这是否是一个编程问题 我开始怀疑是这样 但后来我在 Windows 控制台而不是 Cygwin 控制台中运行了有问题的 Java 程序 可执行 jar 并且它运行良好 输出重音良好 重音输入接受良好 因此以下内容仅适用于 Cygwin
  • kernel.h中min宏中的“(void)(&_min1 == &_min2)”的作用是什么?

    In kernel h分钟定义为 define min x y typeof x min1 x typeof y min2 y void min1 min2 min1 lt min2 min1 min2 我不明白那条线是什么 void mi
  • 在 SimpleInjector 中使用 IAuthorizationFilter 进行依赖注入

    我有课PermissionFilter实现IAuthorizationFilter from System Web Mvc 由于它具有已映射的依赖项 因此我想使用 SimpleInjector 来提供它 我正在这样做 与 Ninject 合
  • 嵌套 ES6 类?

    似乎可以将类嵌套在构造函数中 然后可以从类中的任何位置实例化 这是官方的吗 编辑 例如 class C constructor class D constructor method var a new D works fine var a
  • 跨域AJAX withCredentials,PHP返回标头内容长度,但没有内容

    我正在尝试从一个域上的页面向另一个域上的 PHP 服务器发送跨域请求 没有凭据 一切都可以正常工作 我需要一个会话 但一旦添加凭据 它就不起作用 这是JS代码 var xhr new XMLHttpRequest xhr open GET
  • 使用 $_GET 字符串传递换行符

    我必须将字符串传递给表单 我想按以下方式混合使用 GET 和 POST
  • ViewBox 内的 WPF TextBox 在调整大小时丢失光标

    我在视图框中有一个文本框 当我尝试调整窗口大小时 文本框大小和字体大小会缩放 但如果我尝试聚焦文本框并尝试使用键盘在文本框中移动光标 有时光标会消失 有没有办法始终显示光标 请参考下面的代码 其中 ViewBox 内有一个 TextBox