我不想在 DatePicker 中显示“SELECT DATE”消息

Posted

技术标签:

【中文标题】我不想在 DatePicker 中显示“SELECT DATE”消息【英文标题】:I Don't want message "SELECT DATE" in DatePicker 【发布时间】:2015-02-27 00:56:57 【问题描述】:

我不想在 DatePicker 的文本框中显示“选择日期”,但我想看到类似 //____ 或其他文本的内容。

这是我的资源

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Style x:Key="ABC" TargetType="DatePicker">
    <Setter Property="Foreground" Value="#FF333333" />
    <Setter Property="IsTodayHighlighted" Value="True" />
    <Setter Property="SelectedDateFormat" Value="Short" />
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="DisplayDateStart" Value=" 01/01/1990" />
    <Setter Property="DisplayDateEnd" Value="12/31/2090" />        
    <Setter Property="Padding" Value="2"/>
    <Setter Property="FontFamily" Value="Verdana" />
    <Setter Property="FontSize" Value="14" />

    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="HorizontalAlignment" Value ="Center" />
    <Setter Property="VerticalAlignment" Value= "Center" />

    <Setter Property = "Text" Value="x:Null" />
    <Setter Property = "SelectedDate" Value="x:Null" />

    <Style.Triggers>
        <Trigger Property ="IsMouseOver" Value="True">
            <Setter Property= "Background" Value="Coral"/>
        </Trigger>

        <Trigger Property="IsFocused" Value="True">
            <Setter Property= "Background" Value="LemonChiffon"/>
        </Trigger>

    </Style.Triggers>
</Style>

【问题讨论】:

【参考方案1】:

您可以修改DatePickerTextBox的默认模板

要更改的是“PART_Watermark”内容控件。 DatePicker 的代码设置了该控件的 Content 属性,因此我们不能只更改 Content。而是覆盖此控件的 ControlTemplate,并将其设置为带有所需文本的 TextBlock。

<ContentControl x:Name="PART_Watermark"
                    Opacity="0"
                    Focusable="False"
                    IsHitTestVisible="False"
                    Padding="2">
    <ContentControl.Template>
        <ControlTemplate>
            <TextBlock Text="//____"/>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

这就是全部内容:

<Style TargetType="x:Type DatePickerTextBox">
    <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.WindowTextBrushKey" />
    <Setter Property="Background" Value="DynamicResource x:Static SystemColors.WindowBrushKey" />
    <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
    <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DatePickerTextBox">
                <Grid>
                    <Grid.Resources>
                        <SolidColorBrush x:Key="WatermarkBrush" Color="#FFAAAAAA"/>
                    </Grid.Resources>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup Name="CommonStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="0" />
                                <VisualTransition To="MouseOver" GeneratedDuration="0:0:0.1" />
                            </VisualStateGroup.Transitions>
                            <VisualState Name="Normal" />
                            <VisualState Name="MouseOver">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="ContentElement" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" To="#FF99C1E2" Duration="0"/>
                                    <ColorAnimation Storyboard.TargetName="watermark_decorator" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" To="#FF99C1E2" Duration="0"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup Name="WatermarkStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="0" />
                            </VisualStateGroup.Transitions>
                            <VisualState Name="Unwatermarked" />
                            <VisualState Name="Watermarked">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="ContentElement" Storyboard.TargetProperty="Opacity" To="0" Duration="0" />
                                    <DoubleAnimation Storyboard.TargetName="PART_Watermark" Storyboard.TargetProperty="Opacity" To="1" Duration="0" />
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup Name="FocusStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="0" />
                            </VisualStateGroup.Transitions>
                            <VisualState Name="Unfocused" />
                            <VisualState Name="Focused">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="Opacity" To="1" Duration="0" />
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>


                    <Border x:Name="Border" 
                            Background="TemplateBinding Background" 
                            BorderBrush="TemplateBinding BorderBrush" 
                            BorderThickness="TemplateBinding BorderThickness"
                            Padding="TemplateBinding Padding"
                            CornerRadius="1" 
                            Opacity="1">
                        <Grid x:Name="WatermarkContent"
                              HorizontalAlignment="TemplateBinding HorizontalContentAlignment"
                              VerticalAlignment="TemplateBinding VerticalContentAlignment">
                            <Border x:Name="ContentElement" BorderThickness="1">
                                <Border.BorderBrush>
                                    <SolidColorBrush Color="#FFFFFFFF"/>
                                </Border.BorderBrush>
                            </Border>
                            <Border x:Name="watermark_decorator" BorderThickness="1">
                                <Border.BorderBrush>
                                    <SolidColorBrush Color="#FFFFFFFF"/>
                                </Border.BorderBrush>
                                <ContentControl x:Name="PART_Watermark"
                                                    Opacity="0"
                                                    Focusable="False"
                                                    IsHitTestVisible="False"
                                                    Padding="2">
                                    <ContentControl.Template>
                                        <ControlTemplate>
                                            <TextBlock Text="//____"/>
                                        </ControlTemplate>
                                    </ContentControl.Template>
                                </ContentControl>
                            </Border>
                            <ScrollViewer x:Name="PART_ContentHost" 
                                          Margin="0"
                                          HorizontalContentAlignment="TemplateBinding HorizontalContentAlignment"
                                          VerticalContentAlignment="TemplateBinding VerticalContentAlignment" />
                            <Border x:Name="FocusVisual" BorderBrush="#FF45D6FA" CornerRadius="1" Opacity="0" IsHitTestVisible="False"/>
                        </Grid>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

太棒了!!!!谢谢你的帮助 !!!这就是我所需要的。最好的问候和新年快乐! ;-)【参考方案2】:

扩展@wizzardz 的答案,您可以在代码中引入一个 DependencyProperty 以在 DesingTime 上设置 XAML 中的值:

    public class CustomDatePicker : DatePicker

    public string WatermarkText
    
        get  return (string)GetValue(WatermarkTextProperty); 
        set  SetValue(WatermarkTextProperty, value); 
    

    public static readonly DependencyProperty WatermarkTextProperty =
            DependencyProperty.Register("WatermarkText", typeof(string), typeof(CustomDatePicker), new PropertyMetadata("Datum wählen..."));

    public override void OnApplyTemplate()
    
        base.OnApplyTemplate();
        DatePickerTextBox box = base.GetTemplateChild("PART_TextBox") as DatePickerTextBox;
        box.ApplyTemplate();

        ContentControl watermark = box.Template.FindName("PART_Watermark", box) as ContentControl;
        watermark.Content = WatermarkText;
    

在 XAML 中

<local:CustomDatePicker WatermarkText="Start"/>

这样你也可以在水印文本上设置绑定。

【讨论】:

完美!应该是公认的答案。【参考方案3】:

这是代码中的另一种解决方案

public class CustomWatermarkedDatePicker : DatePicker

    public override void OnApplyTemplate()
    
        base.OnApplyTemplate();

        DatePickerTextBox box = base.GetTemplateChild("PART_TextBox") as DatePickerTextBox;
        box.ApplyTemplate();

        ContentControl watermark = box.Template.FindName("PART_Watermark", box) as ContentControl;
        watermark.Content = "Custom Text";
    

希望这会有所帮助。

【讨论】:

以上是关于我不想在 DatePicker 中显示“SELECT DATE”消息的主要内容,如果未能解决你的问题,请参考以下文章

带有隐藏输入的 jqueryui datepicker

JQuery DatePicker 只读

在 bootstrap-datepicker 上突出显示某些日期

Android如何在片段中显示DatePicker?

datepicker 在 IE11 中不显示日历

显示日期是一个 md-datepicker 字段