我不希望DatePicker中的消息“SELECT DATE”

时间:2014-12-30 21:08:49

标签: wpf datepicker

我不希望在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>

3 个答案:

答案 0 :(得分:8)

您可以修改DatePickerTextBox

的默认模板

要改变的是'PART_Watermark&#39; ContentControl中。 DatePicker的代码设置此控件的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>

答案 1 :(得分:4)

这是代码

的另一个解决方案
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";
    }
}

希望这有帮助。

答案 2 :(得分:3)

扩展@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"/>

这样,您还可以在水印文本上设置“绑定”。