WPF DataGridCell水印风格。无法编辑单元格

时间:2018-01-15 16:34:44

标签: c# wpf datagridcell

我想在我的应用中为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;

它工作正常。执行此代码时,将正确应用水印样式。但是当我专注于细胞时,我什么都写不出来 我的意思是,&#34; IsFocused&#34;触发器被执行并且Label被折叠(它消失了)但我无法在单元格内输入任何内容。

2 个答案:

答案 0 :(得分:0)

试试这个,更新

<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>

            

答案 1 :(得分:0)

您错过了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>