zoukankan      html  css  js  c++  java
  • 2018-9-28-WPF-自定义-TextBoxView-的-Margin-大小

    title author date CreateTime categories
    WPF 自定义 TextBoxView 的 Margin 大小
    lindexi
    2018-09-28 17:16:17 +0800
    2018-09-28 16:59:57 +0800
    WPF

    在 WPF 的 TextBox 里有 TextBoxView 用来渲染 TextBox 内容,但是在 TextBox 里面的 TextBoxView 是不能直接设置而且默认的 Margin 是 2,0,2,0 如何自定义这个值

    先来写一个简单的程序告诉大家这个问题,创建一个空白 WPF 程序,在里面添加一个 TextBox 设置 TextBox 居中

            <TextBox Width="100" HorizontalAlignment="Center" VerticalAlignment="Center">
    
            </TextBox>
    
            <TextBlock Margin="10,100,10,10" Text="欢迎访问我博客 http://lindexi.gitee.io 里面有很多 UWP 博客" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>

    可以看到现在的 TextBox 光标和 TextBox 的左边有 2 像素的距离,通过 Snoop 可以看到这个 TextBoxView 的 Margin 是 2,0,2,0 而且无法直接修改

    从 WPF 的源代码可以看到 TextBoxView 是 internal 的也就是无法直接修改 Style 在构造函数设置了 Margin 的值,这里的 CaretElement.BidiCaretIndicatorWidth 就是 2 这就是默认的大小

    最简单的解决方法是通过设置 TextBox 的 Padding 的方法

            <TextBox Width="100" Padding="-2,0,-2,0" HorizontalAlignment="Center" VerticalAlignment="Center">
    
            </TextBox>

    因为在 TextBox 里面存在 TextBoxView 的偏移,使用相反的值可以让 TextBoxView 的偏移取消,这里的 Padding 需要根据自己的需要设置

    如果设置 Padding 的负数比较小,如 -500 就可以在 TextBox 的外面输入

    如果这里的 TextBox 不是在 ListView 或其他控件使用了 TextBox 的,可以使用自己创建的类继承 TextBox 可以通过在 Load 重写控件的 Margin 重写

        public class PeedereJiyay : TextBox
        {
            /// <inheritdoc />
            public PeedereJiyay()
            {
                Loaded += PeedereJiyay_Loaded;
            }
    
            private void PeedereJiyay_Loaded(object sender, RoutedEventArgs e)
            {
                if (Template.FindName("PART_ContentHost", this) is ScrollViewer contentHost && contentHost.Content != null && contentHost.Content is FrameworkElement textBoxView)
                {
                	// 这里解决 TextBoxView 的 Margin 不能设置
                    textBoxView.Margin = new Thickness(0, 0, 0, 0);
                }
            }
        }

    现在修改一下界面,在界面使用创建的 PeedereJiyay 替换原来的控件

            <local:PeedereJiyay Width="100" HorizontalAlignment="Center" VerticalAlignment="Center">
    
            </local:PeedereJiyay>

    只要是单独使用文本,可以尝试继承 TextBox 的类。如果是使用其他控件,建议使用修改 Padding 的方法

    c# - How to set the margin on a internal TextBoxView in wpf - Stack Overflow

  • 相关阅读:
    模块的种类和导入方法
    小知识点补充
    9.17模拟赛2.0
    hdu2181 哈密顿绕行世界问题
    9.17模拟赛
    9.15模拟赛
    P1084 疫情控制
    9.14模拟赛
    【bzoj1232】[Usaco2008Nov]安慰奶牛cheer
    P3128 [USACO15DEC]最大流Max Flow
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086211.html
Copyright © 2011-2022 走看看