【WPF】TextBox样式重写注意事项

1、普通控件重写需要添加一行

 <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"  Margin="{TemplateBinding Padding}"></ContentPresenter>

2、TextBox之类的编辑控件重写,需要填加一行

 <ScrollViewer x:Name="PART_ContentHost"></ScrollViewer>

只有这样才能进入编辑模式

举个栗子:

复制代码
<ControlTemplate x:Key="RoundTextBoxTemplate" TargetType="TextBox">
        <Border CornerRadius="5" BorderBrush="LightSkyBlue" BorderThickness="2" Background="{TemplateBinding Background}" Margin="3">
            <ScrollViewer x:Name="PART_ContentHost"></ScrollViewer>
        </Border>
    </ControlTemplate>

    <Style x:Key="RoundTextBoxStyle" TargetType="TextBox">
        <Setter Property="Template" Value="{DynamicResource ResourceKey=RoundTextBoxTemplate}" ></Setter>
    </Style>
复制代码

上面就是实现最简单的TextBox重写样式的功能了

 下面记录一个圆角文本框外带提示信息的功能:2021-06-07

复制代码
<TextBox MinWidth="100" MinHeight="30">
            <TextBox.Resources>
                <VisualBrush x:Key="HintText" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
                    <VisualBrush.Visual>
                        <TextBlock FontStyle="Italic" Text="请输入文本"/>
                    </VisualBrush.Visual>
                </VisualBrush>
            </TextBox.Resources>
            <TextBox.Style>
                <Style TargetType="TextBox">
                    <Style.Setters>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Border x:Name="border" CornerRadius="5" BorderThickness="2" BorderBrush="Red">
                                        <TextBox Name="txt" VerticalAlignment="Center" BorderThickness="0" BorderBrush="{x:Null}" Background="{x:Null}"></TextBox>
                                    </Border>
                                    <ControlTemplate.Triggers>
                                        <Trigger SourceName="txt" Property="Text" Value="{x:Null}">
                                            <Setter TargetName="border" Property="Background" Value="{StaticResource HintText}"/>
                                        </Trigger>
                                        <Trigger  SourceName="txt" Property="Text" Value="">
                                            <Setter TargetName="border" Property="Background" Value="{StaticResource HintText}"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style.Setters>
                </Style>
            </TextBox.Style>

        </TextBox>
复制代码

这样也可以实现:

复制代码
 <TextBox Width="200" Height="30" VerticalContentAlignment="Center">
            <TextBox.Resources>
                <VisualBrush x:Key="HintText" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
                    <VisualBrush.Visual>
                        <TextBlock FontStyle="Italic" Text="提示文字"/>
                    </VisualBrush.Visual>
                </VisualBrush>
                <Style TargetType="Border">
                    <Setter Property="CornerRadius" Value="5"></Setter>
                    <Setter Property="BorderThickness" Value="2"></Setter>
                    <Setter Property="BorderBrush" Value="Red"></Setter>
                </Style>
            </TextBox.Resources>
            <TextBox.Style>
                <Style TargetType="TextBox">
                    <Style.Triggers>
                        <Trigger Property="Text" Value="{x:Null}">
                            <Setter Property="Background" Value="{StaticResource HintText}"/>
                        </Trigger>
                        <Trigger Property="Text" Value="">
                            <Setter Property="Background" Value="{StaticResource HintText}"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
复制代码

 

posted on   梦琪小生  阅读(1366)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示