【问题标题】:WPF DataGridCell watermark style. Cannot edit the cellWPF DataGridCell 水印样式。无法编辑单元格
【发布时间】:2018-01-15 16:34:43
【问题描述】:

我想在我的应用程序中为DataGridCell 添加一个样式,以在单元格为空的情况下产生带水印的“提示”效果,从而向用户提示他需要在单元格中输入什么。

<Window.Resources>
    <Style x:Key="WatermarkTextBox" TargetType="{x:Type DataGridCell}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Grid>
                        <Border x:Name="BorderBase" Background="White" BorderThickness="1.4,1.4,1,1" BorderBrush="Red">
                            <Label x:Name="TextPrompt" 
                            Content="{Binding RelativeSource={RelativeSource  Mode=TemplatedParent}, Path=Tag}" 
                            Background="{TemplateBinding Background}" Visibility="Visible" 
                            Focusable="False" Foreground="Silver"/>
                        </Border>
                        <!--<ScrollViewer Margin="0" x:Name="PART_ContentHost" Foreground="Black"/>-->
                    </Grid>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsFocused" Value="False"/>
                                <Condition Property="Content" Value=""/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Visibility" TargetName="TextPrompt" Value="Visible"/>
                        </MultiTrigger>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter Property="BorderBrush" TargetName="BorderBase" Value="Black"/>
                            <Setter Property="Visibility" TargetName="TextPrompt" Value="Collapsed"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="Foreground" Value="DimGray" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

这是我的代码:

Style style = this.FindResource("WatermarkTextBox") as Style;
myCell.Tag = "input position here please";
myCell.Style = style;

而且效果很好。执行此代码时,将正确应用水印样式。但是当我专注于单元格时,我什么也写不出来。
我的意思是,“IsFocused”触发器被执行,Label 被折叠(消失),但我无法在单元格内输入任何内容。

【问题讨论】:

  • WpfToolkit 有一个 WatermarkTextbox 可供您使用

标签: c# wpf datagridcell


【解决方案1】:

您缺少ContentPresenter

<Style x:Key="WatermarkTextBox" TargetType="{x:Type DataGridCell}">
    <Setter Property="Tag" Value="insert" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Grid>
                    <Border x:Name="BorderBase" Background="White" BorderThickness="1.4,1.4,1,1" BorderBrush="Red">
                        <Label x:Name="TextPrompt" 
                                               Content="{Binding RelativeSource={RelativeSource  Mode=TemplatedParent}, Path=Tag}" 
                                               Background="{TemplateBinding Background}" Visibility="Visible" 
                                               Focusable="False" Foreground="Silver"/>
                    </Border>
                    <ContentPresenter x:Name="cp" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsFocused" Value="False"/>
                            <Condition Property="Content" Value=""/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Visibility" TargetName="TextPrompt" Value="Visible"/>
                        <Setter Property="Visibility" TargetName="cp" Value="Collapsed"/>
                    </MultiTrigger>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="BorderBrush" TargetName="BorderBase" Value="Black"/>
                        <Setter Property="Visibility" TargetName="TextPrompt" Value="Collapsed"/>
                        <Setter Property="Visibility" TargetName="cp" Value="Visible"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Foreground" Value="DimGray" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

  • 成功了。但是现在当我编辑单元格内容并离开单元格时,TextPrompt 再次可见,带有红色边框。另一件事是,当我再次关注单元格时,TextPrompt 消失了,单元格的内容也消失了。当我离开它时,内容会再次出现。
  • 是的,为什么不呢?您以这种方式实现了它。您仅在单元​​格聚焦时隐藏 TextBlock,所以这是我所期望的行为。您当前的问题是什么?如果您有其他问题,请提出一个新问题。我相信您的原始问题已得到解答,即您缺少 ContentPresenter。
  • 不,我需要一个提示文本,只要单元格中没有内容就可见,但当用户在单元格中输入内容时它就会消失。
【解决方案2】:

试试这个,更新

<Style x:Key="WatermarkTextBox"  TargetType="{x:Type TextBox}">

    <Setter Property="FontSize" Value="12" />

    <Setter Property="Background" Value="Transparent" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBoxBase}">

                <Grid>

                    <Border
                        x:Name="border"
                        SnapsToDevicePixels="True">
                        <ScrollViewer
                            x:Name="PART_ContentHost"
                            Focusable="False"
                            HorizontalScrollBarVisibility="Hidden"
                            VerticalScrollBarVisibility="Hidden" />
                    </Border>

                    <TextBlock
                        x:Name="placeholder"
                        VerticalAlignment="Center"
                        IsHitTestVisible="False"
                        Text="{TemplateBinding Tag}">
                        <TextBlock.Style>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="Visibility" Value="Collapsed" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource TemplatedParent}}" Value="">
                                        <Setter Property="Visibility" Value="Visible" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>

                    </TextBlock>

                </Grid>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="border" Property="Opacity" Value="0.56" />
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="border" Property="BorderBrush" Value="#FF7EB4EA" />
                    </Trigger>
                    <Trigger Property="IsKeyboardFocused" Value="True">
                        <Setter TargetName="border" Property="BorderBrush" Value="#FF569DE5" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

</Style>

用法

            <DataGrid.Columns>
                <DataGridTemplateColumn Header="  Tags  ">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>

                            <TextBox Style="{StaticResource WatermarkTextBox}"
                                FontSize="12"
                                VerticalAlignment="Center"                                    
                                Tag="Stage Name .." 
                                Width="60"/>

                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

【讨论】:

  • 我收到此错误:“System.Windows.Data 错误:40:BindingExpression 路径错误:在 'object' ''DataGridCell' (Name='')' 上找不到 'Text' 属性。BindingExpression :Path=Text; DataItem='DataGridCell' (Name=''); 目标元素是 'TextBlock' (Name=''); 目标属性是 'NoTarget' (type 'Object')"
  • 我不能只用普通的 DataGridTextColumn 吗?
  • 当我尝试将目标类型更改为 DataGridCell 的代码时,它不会显示单元格中的文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2011-02-19
相关资源
最近更新 更多