如何应用TextBox控件模板?

2023-11-29

我正在尝试简化一些代码并提高可维护性。

我最初正在寻找一种使文本框向左对齐的方法,它可以收缩和扩展到最大值,而无需在达到最大值后在网格单元内居中。

所以我开始编写一些这样的代码......

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <TextBox Text="Some text"
             VerticalAlignment="Center"
             HorizontalAlignment="Stretch"
             Margin="10"
             MaxWidth="150" />
</Grid>

(代码清单1)

这会产生看起来像这样的东西......

TextBox in Grid Centered

(图1)

正如您所看到的,这使 TextBox 以其最大宽度居中,但它在网格单元的中心对齐。

所以我想也许如果我像这样改变文本框的水平对齐方式......

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <TextBox  Text="Some text"
              VerticalAlignment="Center"
              HorizontalAlignment="Left"
              Margin="10"
              MaxWidth="100" />
</Grid>

(代码清单2)

但不幸的是,这只产生看起来像这样的东西......

Too small TextBox left aligned

(图2)

同样,这是不对的,因为尽管右侧有所有空白空间,但文本框并未像我想要的那样扩展到最大宽度 100。

最终,我发现如果将TextBox放在嵌套网格中,您将达到预期的效果。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"
                              MaxWidth="120" />
            <ColumnDefinition Width="0*" />
        </Grid.ColumnDefinitions>
        <TextBox Text="Some text"
             VerticalAlignment="Center"
             HorizontalAlignment="Stretch"
             Margin="10"
             MaxWidth="100" />
    </Grid>
</Grid>

(代码清单3)

这会产生这个...

Correct looking TextBox

(图3)

正如您所看到的,嵌套网格填充了整个 200 宽的空间,但文本框填充了左侧 100,并在右侧留下了空白空间。 (如果该窗口可调整大小,它将适当缩小和扩大)

我想应用以下方法代码清单3样式或控件模板,因此我可以将其一揽子应用于适用于这种情况的文本框。

在完美的情况下,我会做类似的事情......

<TextBox Text="Some text"
         VerticalAlignment="Center"
         HorizontalAlignment="Stretch"
         Margin="10"
         MaxWidth="100"
         Style="{StaticResource ExpandingTextBox}" /> 

(代码清单4)

并达到相同的结果Figure 3.

我尝试了以下...

<Style TargetType="{x:Type TextBox}"
       x:Key="ExpandingTextBox">
    <Setter Property="OverridesDefaultStyle"
            Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*"
                                          MaxWidth="170" />
                        <ColumnDefinition Width="0*" />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

(代码清单5)

但这只会导致文本框从我的表单中一起消失。我不太擅长写这样的模板,所以我有点不知所措。

另外,我刚刚意识到的一件事是嵌套列的宽度 = MaxWidth + 2 x Margin。我不介意在 TextBox 声明中显式设置列宽,但如果它可以是自动的,那就太棒了。


您需要在模板中使用 TextBox 而不是 ContentPresenter。您将 TextBox 的默认模板替换为不再具有文本输入区域的模板。 尝试这样:

 <Style TargetType="{x:Type TextBox}" x:Key="ExpandingTextBox">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TextBox">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*"
                                      MaxWidth="170" />
                            <ColumnDefinition Width="0*" />
                        </Grid.ColumnDefinitions>
                        <TextBox  Text="{TemplateBinding Text}"
                                  VerticalAlignment="Center"
                                  HorizontalAlignment="Stretch"
                                  Margin="10"
                                  MaxWidth="100"
                         />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

这应该可行,但在我看来,有点奇怪..

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

如何应用TextBox控件模板? 的相关文章

  • 为什么我应该使用内联代码? [复制]

    这个问题在这里已经有答案了 我是一名 C C 开发人员 这里有几个始终困扰我的问题 常规 代码和内联代码之间有很大区别吗 主要区别是什么 内联代码只是宏的一种 形式 吗 选择内联代码时必须进行什么样的权衡 Thanks 表现 正如之前的答案
  • 如何转发声明要在 unique_ptr 的标准容器中使用的类

    在智能指针的标准容器中使用它时 是否可以避免完整的类定义可见 例如 我无法编译以下内容 include
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • 错误:“运行所选代码生成器时出错:包恢复失败”

    我正在尝试将控制器添加到 ASP NET Core 项目中的解决方案中 当我尝试这样做时 我收到此错误 我收到相同的消息 为控制器添加最小依赖项和完整依赖项 我也有这个问题 使用实体框架添加控制器 gt 带有操作的 API 控制器 将给出
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 为什么我收到编译错误“使用已删除的函数 'std::unique_ptr ...”

    我收到一条巨大的编译错误消息 c mingw include c 6 1 0 bits predefined ops h 123 18 error use of deleted function std unique ptr lt Tp D
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • ef core 在更新数据库期间不使用 ASPNETCORE_ENVIRONMENT

    我使用 Visual Studio 通过一定的迁移来更新我的所有环境 使用下面的命令效果很好 update database Migration initMigrationProduct c ProductContext Environme
  • WCF 服务中的缓冲区大小

    我们有一个 WCF 服务 它执行某些存储过程并将结果返回给 silverlight 客户端 某些存储过程最多返回 80K 行 下面给出的是 web config 中服务的设置
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • 如何在realm-dotnet中存储System.Collections.Generic.Dictionary

    我正在尝试将 Realm NET 集成到我的 uwp 项目中 我想知道是否有任何方法可以在 Realm dotnet 库中存储 System Collections Generic Dictionary 我试过这个 public class
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A
  • SMTP 客户端在 C# 应用程序中显示错误“未采取请求的操作”

    我正在尝试使用 hotmail 帐户设置电子邮件发送应用程序 代码如下所示 MailMessage mail new MailMessage from to mail Subject Proba email mail Attachments
  • DbContext.SaveChangesAsync 异常处理

    当搭建新的脚手架时ApiController通过 Visual Studio 2013 中的异步操作和实体框架支持 某些方法可以包装DbContext SaveChangesAsync https msdn microsoft com en
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720

随机推荐

  • 使用张量板时,如何总结多个小批量计算的损失?

    我想使用 Tensorboard 来可视化验证样本中损失的演变 但验证集太大 无法在一个小批量中进行计算 因此 为了计算我的验证损失 我必须在覆盖验证集的多个小批量上多次调用 session run 然后我将每个小批量的损失 在Python
  • “无法映射用于编码 UTF-8 的字符”错误

    我在以下方法中遇到编译错误 public static boolean isValidPasswd String passwd String reg 0 9 a z A Z s 8 24 return Pattern matches reg
  • 包含 WEB-INF 中的 javascript 文件 [重复]

    这个问题在这里已经有答案了 我正在用struts开发一个网站 我的文件夹结构如下 现在 我有一个jsp页面register jsp 我想在其中添加jquery validate js文件 我已遵循以下链接的建议 无法在 JSP 中包含 WE
  • iPhone 上的 CSS 过滤器速度慢?

    我有一个带有这个 css 类的 div pos webkit filter brightness 0 5 moz filter britghtness 0 5 o filter brightness 0 5 ms filter bright
  • 将 A4 PDF 页面拆分为两个 A5,然后再拆分回来

    我有一个 A4 页的 PDF 出于打印原因 每页包含两张相同的 A5 页 我想要在我的 Java 程序中做的是拆分这些页面 并使用每个唯一的 A5 页面零到多次作为模板来添加 替换一些文本 完成此操作后 我想将 A5 页再次粘回 A4 页
  • 在 C++11/14 中按值返回局部变量是否会导致在不涉及复制/移动时由右值构造返回值?

    我知道在以下情况下 编译器可以自由地移动构造来自makeA 但也可以自由地删除副本或完全移动 struct A A A A A A makeA A localA return localA 我想知道编译器是否允许构造类型的对象A来自类型的本
  • Kubernetes 服务无法访问

    我在 2 个 Rasberry Pi 型号 3 和 3B 上创建了一个 Kubernetes 集群 用作 Kubernetes 游乐场 我已经部署了一个 postgresql 和一个 spring boot 应用程序 称为meal plan
  • 在 bash 脚本中查找文件夹名称的一部分

    尝试在文件夹结构中查找特定部分 但我在 bash 脚本中使用 RegEx 时遇到问题 此外 我的正则表达式说得不太流利 我需要知道我传递给 bash 脚本的文件夹 类型 根据当前所在的文件夹 类型 需要运行不同的操作 以下示例文件夹结构 h
  • 从 HTML 表单调用 servlet,但从未调用 servlet [重复]

    这个问题在这里已经有答案了 我从 html 表单调用 servlet servlet 获取表单数据 并将该表单数据插入数据库 但是当我单击提交按钮时 错误页面出现 请帮助我的 servlet 代码出了什么问题 我的servlet代码 imp
  • 使用 JMH 时出现奇怪的输出

    我正在使用 jmh 来对一个简单的应用程序进行基准测试 来自 SO 问题java fork join 中出现意外的可扩展性 使用 Maven 并遵循命令行方法 如建议的http openjdk java net projects code
  • Java - 如何检查另一个(非 Java)进程是否正在 Linux 上运行

    我遇到了一些奇怪的问题 我们正在使用 Xvfb 虚拟桌面管理器 并希望在继续之前确保它正在运行 使用纯 shell 我可以轻松做到这一点 ps ef grep Xvfb grep v grep 这正是我所需要的 一行包含有关 Xvfb 过程
  • 如何进一步处理导致 Ruby FasterCSV 库抛出 MalformedCSVError 的数据行?

    传入数据文件包含格式错误的 CSV 数据 例如非转义引号 以及 有效 CSV 数据 例如包含换行符的字段 如果检测到 CSV 格式错误 我想对该数据使用替代例程 使用以下示例代码 为简单起见进行了缩写 FasterCSV open file
  • 应该避免使用 DataFrame 函数 groupBy 吗?

    This link and others告诉我火花groupByKey如果有大量键 则不要使用 因为 Spark 会打乱所有键 这同样适用于groupBy功能也一样 或者这是不同的东西 我问这个是因为我想做这个问题尝试这样做 但我有大量的钥
  • Win7和Win XP关机前运行程序

    我知道有关于此的线程 我找到了这个 如何安排任务在关闭窗口时运行但这对我来说失败了 我在 LabView 中编写了一个小程序并用它制作了一个 exe 当我在正常的 Windows 操作中双击 exe 时 它 运行完美 只需几秒钟即可完成 然
  • #include 文件指令不起作用

    所以我需要照顾这个新网站 http www kineformeconcept com mtl index shtml 自从客户端移动到托管位置后 菜单就不再显示 我从未使用过 include file whatever html 指令 我现
  • 在 C# 中使用 RotateFlip 旋转图像

    我有这段代码用于在 C Windows 窗体应用程序中的 if 循环中旋转图像 但窗体在窗体输出中不显示任何内容 有人可以帮忙吗 this splitContainer1 Panel2 Controls Add PictureBox1 Pi
  • 在Python中分割列表

    我正在用 Python 编写一个解析器 我已将输入字符串转换为标记列表 例如 2 x 3 1 4 3 x 2 我希望能够将列表拆分为多个列表 例如str split 功能 但似乎没有办法做到my list split 有任何想法吗 Than
  • ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象

    基本上 我有一个表 其中包含一家公司的一些属性 这是 主 表 它们的 ID 用于许多其他表 我基本上是通过这个方法找到他们的ID private Company currentcompany Company cuco db Companie
  • Magento Catalog_category_flat_store_1 不存在

    我有一个运行 Magento CE 1 7 的现有商店 突然从今天早上开始 没有任何代码更新 我收到以下错误 a 5 i 0 s 111 SQLSTATE 42S02 未找到基表或视图 1146 表 XXXXXX catalog categ
  • 如何应用TextBox控件模板?

    我正在尝试简化一些代码并提高可维护性 我最初正在寻找一种使文本框向左对齐的方法 它可以收缩和扩展到最大值 而无需在达到最大值后在网格单元内居中 所以我开始编写一些这样的代码