Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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
C# 制造;“违约”;使用XAML在没有焦点的空文本框中显示的文本_C#_Wpf_Xaml - Fatal编程技术网

C# 制造;“违约”;使用XAML在没有焦点的空文本框中显示的文本

C# 制造;“违约”;使用XAML在没有焦点的空文本框中显示的文本,c#,wpf,xaml,C#,Wpf,Xaml,我想创建一个文本框,如果它是 a) 空的 b) 失去了焦点 当用户进入文本框时,灰色的“默认”文本将出现 我尝试使用ControlTemplate.Triggers执行此操作,但似乎找不到HasFocus属性 使用XAML执行此操作的最佳方法是什么?您只需使用的。 我根据您关于如何在项目中添加和使用库的评论编写了一个小指南 步骤1)右键单击项目中的引用,然后选择添加引用 步骤2)找到并添加dll文件WPFToolkit.Extended.dll 步骤3)最后,您需要添加XAML代码 <

我想创建一个文本框,如果它是

a) 空的

b) 失去了焦点

当用户进入文本框时,灰色的“默认”文本将出现

我尝试使用
ControlTemplate.Triggers
执行此操作,但似乎找不到
HasFocus
属性

使用XAML执行此操作的最佳方法是什么?

您只需使用的。

我根据您关于如何在项目中添加和使用库的评论编写了一个小指南

步骤1)右键单击项目中的
引用
,然后选择
添加引用

步骤2)找到并添加dll文件
WPFToolkit.Extended.dll

步骤3)最后,您需要添加
XAML
代码

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:extToolkit="http://schemas.xceed.com/wpf/xaml/toolkit"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <extToolkit:WatermarkTextBox Watermark="Enter First Name" />
    </Grid>
</Window>
然后您可以像这样在
XAML
中简单地使用它

<extToolkit:WatermarkTextBox Watermark="Enter First Name" />

虽然重新发明车轮没有真正的好处,但看看如何做到这一点可能会很有趣。最简单的方法(纯XAML)是为
TextBox
创建一个
ControlTemplate
,当
TextBlock
未聚焦且不包含文本时,它覆盖在
TextBlock
上:

<ControlTemplate TargetType="TextBox">
<Grid>
    <TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" />
    <TextBlock HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Text="Your Prompt Here"
                Margin="5,0,5,0"
                Foreground="#FF808080"
                FontStyle="Italic"
                IsHitTestVisible="False"
                x:Name="UserMessage"
                Visibility="Hidden"/>
</Grid>
<ControlTemplate.Triggers>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="Text" Value=""/>
            <Condition Property="IsKeyboardFocusWithin" Value="False"/>
            </MultiTrigger.Conditions>
        <Setter Property="Visibility" TargetName="UserMessage" Value="Visible"/>
    </MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>

multi-trigger
表示“如果
Text
属性为空且文本框没有键盘焦点,则将可见性设置为可见”


如果您想使其更易于重用,则可以创建一个自定义控件,将其作为默认模板,并使用包含提示消息的依赖项属性

它是一个自定义库,您可以从我链接到您的站点下载。是的,我做到了。但我必须引用它才能得到水印文本框。该库中有多个程序集。我应该引用哪一个?zip文件
ExtendedWPFToolkit_Binaries.zip
中只有一个dll文件,它应该包含一个名为
WPFToolkit.Extended.dll
的dll文件,您可以在
Visual Studio
中添加为
引用。我把它和wpf工具包混淆了。谢谢np,很高兴你找到了解决方案我同意@Fuji并建议使用
WatermarkTextBox
,但作为将来的参考,
HasFocus
的等价物是
IsKeyboardFocused
,我同意如果在简单的应用程序中很少使用纯XAML,那么它是不错的。我讨厌在项目中添加第三方DLL,除非经常使用。@fuji,了解这些东西是如何工作的很好@SteveGreatrex如何为不同的文本创建自定义控件例如text=“Your Prompt Here”,另一个文本框我需要文本为“You Prompt Here”。
<ControlTemplate TargetType="TextBox">
<Grid>
    <TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" />
    <TextBlock HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Text="Your Prompt Here"
                Margin="5,0,5,0"
                Foreground="#FF808080"
                FontStyle="Italic"
                IsHitTestVisible="False"
                x:Name="UserMessage"
                Visibility="Hidden"/>
</Grid>
<ControlTemplate.Triggers>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="Text" Value=""/>
            <Condition Property="IsKeyboardFocusWithin" Value="False"/>
            </MultiTrigger.Conditions>
        <Setter Property="Visibility" TargetName="UserMessage" Value="Visible"/>
    </MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>