Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在WPF中实现搜索框的默认文本?_Wpf_Search_Textbox - Fatal编程技术网

如何在WPF中实现搜索框的默认文本?

如何在WPF中实现搜索框的默认文本?,wpf,search,textbox,Wpf,Search,Textbox,我想为WPF搜索文本框实现与“”完全类似的功能。该框为空时应显示一些灰显的“搜索…”文本,然后在键入文本时应能正常工作。链接文章展示了如何在javascript中实现这一点。在WPF中,如何沿着这条路径开始?到目前为止,我最好的想法是在主文本框的顶部添加另一个文本框,每当搜索文本框获得焦点或文本时,该文本框将不可见。您可以将文本框转换为灰色文本(每当文本框为空),并使用一个变量告诉您该文本框为空,这样当您单击“搜索”时,它就不会搜索“搜索…” 或者你可以使用类似于你所说的东西,但是你可以在下面有

我想为WPF搜索文本框实现与“”完全类似的功能。该框为空时应显示一些灰显的“搜索…”文本,然后在键入文本时应能正常工作。链接文章展示了如何在javascript中实现这一点。在WPF中,如何沿着这条路径开始?到目前为止,我最好的想法是在主文本框的顶部添加另一个文本框,每当搜索文本框获得焦点或文本时,该文本框将不可见。

您可以将文本框转换为灰色文本(每当文本框为空),并使用一个变量告诉您该文本框为空,这样当您单击“搜索”时,它就不会搜索“搜索…”


或者你可以使用类似于你所说的东西,但是你可以在下面有文本而不是上面的文本框。如果在顶部有一个背景透明的文本框,在底部有一个标签,上面的文本框为空时,标签上有“搜索”,这应该可以解决问题

和WPF一样,有很多方法可以实现您的目标

也许最干净的方法是将
TextBox
子类化,并添加一个名为
HintText
的新属性。控件的模板将显示
HintText
(可能是斜体和灰色),只要
Text
为空(
)。否则,它将像常规的
文本框一样显示
文本

不需要编写自己的控件的另一种方法是重新设置
TextBox
的模板,并使用
Tag
属性来存储提示文本


另一种选择是编写一个
UserControl
,它将
TextBox
TextBlock
组合在同一个
网格中。
TextBlock
将包含提示文本,并且仅当
TextBox
text
为空时才会显示。这可能是最容易实现的,但也是最不灵活的。

试试凯文·摩尔的Bag-o-Tricks中的InfoTextBox示例。你可以从

我认为对于这些类型的东西,最好的方法是使用视觉画笔设置背景。 使用视觉画笔,可以使用视觉元素绘制背景,并根据文本为空将其与触发器组合,这样就完成了

这里是空列表框消息的示例,基本相同。

此样式将使用背景属性和visualbrush显示文本。控件获得焦点后,文本将被删除

    <TextBox.Style>
            <Style TargetType="TextBox">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="">
                        <Setter Property="Background">
                            <Setter.Value>
                                <VisualBrush Stretch="None">
                                    <VisualBrush.Visual>
                                        <TextBlock Text="Enter value" Foreground="Gray"/>
                                    </VisualBrush.Visual>
                                </VisualBrush>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="{x:Null}">
                        <Setter Property="Background">
                            <Setter.Value>
                                <VisualBrush Stretch="None">
                                    <VisualBrush.Visual>
                                        <TextBlock Text="Enter value" Foreground="Gray"/>
                                    </VisualBrush.Visual>
                                </VisualBrush>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsFocused}" Value="True">
                        <Setter Property="Background">
                            <Setter.Value>
                                <VisualBrush Stretch="None">
                                </VisualBrush>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>

我认为WPF扩展工具包中包含的水印文本框正是您想要的


简单明了,我认为这应该被标记为好答案。这会使文本框的背景变成灰色。我试图解决的问题导致默认文本拉伸。我刚刚回答了另一个问题,问了同样的问题: