WPF中的圆角文本框

6
我在网络上搜索带有圆角的文本框,并找到了以下类似于XAML代码:
 <Style TargetType="{x:Type my1:CustomTextBox}">
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate >
                        <Border Background="{TemplateBinding Background}" x:Name="Bd" 
BorderThickness="2" CornerRadius="5" BorderBrush="#FFF9EAB6">
                            ***<ScrollViewer x:Name="PART_ContentHost" />***
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="Bd" Property="BorderBrush" Value="#FFC7B0B0"/>
                            </Trigger>
                            <Trigger Property="IsKeyboardFocused" Value="True">
                                <Setter TargetName="Bd" Property="BorderBrush" Value="#FFC7B0B0"/>
                                <Setter Property="Foreground" Value="Black"/>
                            </Trigger>
                            <Trigger Property="IsKeyboardFocused" Value="False">
                                <Setter Property="Foreground" Value="#FFC7B0B0"/>
                            </Trigger>
                            <Trigger Property="Width" Value="Auto">
                                <Setter Property="MinWidth" Value="120"/>
                            </Trigger>
                            <Trigger Property="Height" Value="Auto">
                                <Setter Property="MinHeight" Value="27"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>

                </Setter.Value>
            </Setter>
        </Style>

我想了解什么是

<ScrollViewer x:Name="PART_ContentHost" />

详细说明一下,如果我从模板中删除这行代码,为什么它不能正常工作?请详细告诉我。
非常感谢。
4个回答

6

"PART_ContentHost"部分包含了控件的核心,也就是文本框本身,除了装饰之外。文本框的代码会寻找它,因此如果您重命名或删除了它,则控件将无法工作。 在这种情况下,内容是可滚动的(因为文本框可以水平和垂直滚动文本)。


感谢您的回答。根据您的讲解,在任何控件的模板中,当我编写 '<ScrollViewer x:Name="PART_ContentHost" />' 代码时,实际控件就放在那里了,而 'x:Name="PART_ContentHost"' 表示控件本身。我相信您的看法。 - Kūrosh
是的,基本上是这样,但并不是所有的控件都有相同的部件名称。这取决于它们的功能。一些示例可以在http://xamlcoder.com/cs/blogs/joe/archive/2007/12/13/building-custom-template-able-wpf-controls.aspx和http://drwpf.com/blog/category/control-templates/中找到。 - user694833

6

使用这部分XAML设计:

 <TextBox x:Name="usernameText" Height="30" Width="300"  TextWrapping="Wrap" Text="" FontSize="20" HorizontalContentAlignment="Center" LostFocus="usernameText_LostFocus">
                        <TextBox.Resources>
                            <Style TargetType="{x:Type Border}">
                                <Setter Property="CornerRadius" Value="10"/>
                            </Style>
                        </TextBox.Resources>
                    </TextBox>

The shape will be like this


5
如果你需要一个带有圆角的简单文本框,可以这样实现:

如果您需要一个带圆角的简单文本框,可以按照以下方式操作:

<Border Padding="5" CornerRadius="5" BorderThickness="1" BorderBrush="LightGray" SnapsToDevicePixels="True" Background="White">
    <TextBox Background="Transparent" BorderThickness="0">This is beautifull ;)</TextBox>
</Border>

是的,它能够工作是因为你将文本框背景颜色设置为透明,但我认为当你为文本框设置不同于边框的背景颜色且这个背景颜色与边框的背景颜色不同时,它就不能工作了。那么在这种情况下,你该如何解决这个问题呢? - Willy

1

ScrollViewer 包含控件的实际内容。 您的控件不是真正的文本框,而实际上是一个带有圆角的边框,围绕着一个 ScrollViewer,您需要在其中放置您的文本。 如果您不需要滚动,则可以用文本框替换 ScrollViewer,例如:

更改为:

<ScrollViewer x:Name="PART_ContentHost" />

<TextBox x:Name="PART_ContentHost" />

谢谢您的回答,我根据上面的解释改了我的代码,但还没有正常工作。 - Kūrosh
你能否也发布一下你的CustomTextBox类的内容?这两个都是必须的,才能完全理解你的代码。 - Simon MᶜKenzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接