【问题标题】:Is there a way to change the text displayed in a DatePicker? Instead of "Select a date", show something else?有没有办法更改 DatePicker 中显示的文本?代替“选择日期”,显示其他内容?
【发布时间】:2019-06-24 12:18:35
【问题描述】:

我想让DatePicker 向用户提示与我的DatePicker 的“选择日期”不同的消息。我最好有一个 resx 条目来确定显示的值,那么DatePicker 的属性是否可以设置为显示不同的打开消息?我可以自己处理问题的 resx 部分,我只需要帮助确定要设置的属性。

我试过使用datepicker.Text = "Enter a date",只是作为测试,但它不显示字符串。

这是DatePicker 的xaml 标记:

<DatePicker Height="28" HorizontalAlignment="Left" Margin="515,55.661,0,0" Name="dtpStartDate" VerticalAlignment="Top" Width="180" FontSize="16" Background="White" SelectedDateFormat="Short" TabIndex="20"/>

【问题讨论】:

  • 这不是您应该使用 XAML 的方式。我强烈建议您学习使用 XAML 并尽快离开设计器。它会让你未来的生活更轻松
  • 你必须告诉我的主管,因为这不是我的代码。我只是在努力。这是怎么回事?它可以完美地显示所需的一切。
  • 它不使用 laguage 提供的布局功能,而是使用硬定义的边距。如果您调整应用程序的大小,它将无法按用户预期工作。顺便说一句,为了实现您的目标,您需要修改日期选择器的原始模板,请参阅:stackoverflow.com/questions/27712590/…
  • 想象一辆汽车向后行驶。你可能会争辩说“为什么这样做不好?它会让我到任何想要的地方!”事实上,你是对的,但这并不意味着按照设计运行的方式使用汽车会让你的生活变得更好、更舒适,并延长汽车/软件的使用寿命。所以请告诉你的主管他在倒车
  • 哦,好吧,这不是问题,因为他们不允许调整此应用程序的大小。我明白你在说什么,理想情况下我们应该制作一个完美的应用程序,但老实说,这个应用程序并不完全是顶级材料,也不会是。我们只需要它做最低限度的工作。另外,感谢您的链接!

标签: vb.net visual-studio xaml


【解决方案1】:

您可以定义一个隐含的DatePickerTextBox 样式,在其中隐藏名为“PART_Watermark”的ContentControl,并在您的自定义文本中添加TextBlock

<DatePicker Height="28" HorizontalAlignment="Left" Margin="515,55.661,0,0" Name="dtpStartDate"
            VerticalAlignment="Top" Width="180" FontSize="16" Background="White" 
            SelectedDateFormat="Short" TabIndex="20">
    <DatePicker.Resources>
        <Style TargetType="DatePickerTextBox">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DatePickerTextBox}">
                        <Grid>
                            <Grid.Resources>
                                <SolidColorBrush x:Key="WatermarkBrush" Color="#FFAAAAAA"/>
                            </Grid.Resources>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualStateGroup.Transitions>
                                        <VisualTransition GeneratedDuration="0"/>
                                        <VisualTransition GeneratedDuration="0:0:0.1" To="MouseOver"/>
                                    </VisualStateGroup.Transitions>
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <ColorAnimation Duration="0" To="#FF99C1E2" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="ContentElement"/>
                                            <ColorAnimation Duration="0" To="#FF99C1E2" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="watermark_decorator"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="WatermarkStates">
                                    <VisualStateGroup.Transitions>
                                        <VisualTransition GeneratedDuration="0"/>
                                    </VisualStateGroup.Transitions>
                                    <VisualState x:Name="Unwatermarked"/>
                                    <VisualState x:Name="Watermarked">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ContentElement"/>
                                            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="PART_Watermark"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualStateGroup.Transitions>
                                        <VisualTransition GeneratedDuration="0"/>
                                    </VisualStateGroup.Transitions>
                                    <VisualState x:Name="Unfocused"/>
                                    <VisualState x:Name="Focused">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisual"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Border x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="1" Opacity="1" Padding="{TemplateBinding Padding}">
                                <Grid x:Name="WatermarkContent" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                    <Border x:Name="ContentElement" BorderBrush="#FFFFFFFF" BorderThickness="1"/>
                                    <Border x:Name="watermark_decorator" BorderBrush="#FFFFFFFF" BorderThickness="1">
                                        <Grid>
                                            <ContentControl x:Name="PART_Watermark" Focusable="False" IsHitTestVisible="False" Opacity="0" Padding="2" Visibility="Collapsed"/>
                                            <TextBlock Text="custom..." />
                                        </Grid>
                                    </Border>
                                    <ScrollViewer x:Name="PART_ContentHost" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="0" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                                    <Border x:Name="FocusVisual" BorderBrush="#FF45D6FA" CornerRadius="1" IsHitTestVisible="False" Opacity="0"/>
                                </Grid>
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DatePicker.Resources>
</DatePicker>

要显示在.resx 文件中定义的资源的值,您可以使用TextBlockText 属性设置x:Static 标记扩展,如下所示,其中“AppResources”是.resx 文件,“HelloWorld”是文件中字符串资源的名称:

<TextBlock Text="{x:Static local:AppResources.HelloWorld}" /> 

唯一的问题是当我选择日期时,水印会保留并被日期覆盖。有没有办法解决这个问题?

好点子。您可以将Style 应用于TextBlock 并使用DataTrigger 绑定到DatePickerSelectedDate 属性:

<TextBlock Text="{x:Static local:AppResources.HelloWorld}">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding SelectedDate, RelativeSource={RelativeSource AncestorType=DatePicker}}" 
                             Value="{x:Null}">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

【讨论】:

  • 唯一的问题是当我选择一个日期时,水印会保留并被日期覆盖。有没有办法解决这个问题?
  • @BrenCou:您可以将Style 用于TextBlock。查看我的编辑。
  • 我实际上发现@BenjaminKrupp 在stackoverflow.com/questions/24394852/… 的回答非常有帮助。他更新了原件来解决这个问题。不过也感谢您的解决方案!
猜你喜欢
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多