UWP - 无法更改CalendarDatePicker的占位符文本

时间:2017-07-17 11:14:31

标签: xaml uwp

我有CalendarDatePicker这样:

<CalendarDatePicker Grid.Row="10"
                                        Grid.Column="0"
                                        Name="BirthdayPicker"
                                        PlaceholderText="{x:Bind ViewModel._FORM_dob, Mode=OneWay}"
                                        HorizontalAlignment="Center"                                 
                                        Margin="0, 10, 0, 10"
                                        DateFormat = "{}{year.full}-{month.integer}-{day.integer}"/>

我无法更改其占位符文字。它始终是第一次获得的占位符(当应用程序启动时)。之后Bindings.Update()不会更改其占位符文本。我也试过后面的代码:

BirthdayPicker.PlaceholderText = string.Empty;
 BirthdayPicker.PlaceholderText = ViewModel._FORM_dob;
 BirthdayPicker.MaxDate = DateTime.Now;

即使这样也不会更改占位符文字。在调试期间,它显示占位符属性已更改但它没有在UI中反映

1 个答案:

答案 0 :(得分:1)

这是由于控件的默认样式设计不佳。

default style内,TextBlock名为DateTextPlaceholderText通过TemplateBindingDate绑定。但是,此控件还用于显示所选的Text字符串。通过这样做,PlaceholderTextTextBlock之间的绑定将被破坏,这就是为什么当您为后者提供不同的值时,更改不会反映在UI上。

我说它设计不好的原因是因为占位符文本永远不应该用于显示日期文本。相反,应仅为此目的创建单独的TextBlock。控件的用户应该期望任何非readonly 依赖项属性只能使用绑定,而不必担心它们被隐藏代码破坏。

解决方案

所以我稍微修改了默认样式以包含一个新的PlaceholderText,仅用于显示TemplateBinding属性。我从DateText移除了Visibility,并在Selected视觉状态内更改了颜色以及一些<Style TargetType="CalendarDatePicker"> <Setter Property="Foreground" Value="{ThemeResource CalendarDatePickerForeground}" /> <Setter Property="Background" Value="{ThemeResource CalendarDatePickerBackground}" /> <Setter Property="BorderBrush" Value="{ThemeResource CalendarDatePickerBorderBrush}" /> <Setter Property="BorderThickness" Value="{ThemeResource CalendarDatePickerBorderThemeThickness}" /> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="VerticalAlignment" Value="Center" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="CalendarDatePicker"> <Grid x:Name="Root"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="32" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="32" /> </Grid.RowDefinitions> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal" /> <VisualState x:Name="PointerOver"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background" Storyboard.TargetProperty="BorderBrush"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerBorderBrushPointerOver}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background" Storyboard.TargetProperty="Background"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerBackgroundPointerOver}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Pressed"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background" Storyboard.TargetProperty="Background"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerBackgroundPressed}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background" Storyboard.TargetProperty="BorderBrush"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerBorderBrushPressed}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Disabled"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background" Storyboard.TargetProperty="Background"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerBackgroundDisabled}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background" Storyboard.TargetProperty="BorderBrush"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerBorderBrushDisabled}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HeaderContentPresenter" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerHeaderForegroundDisabled}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DateText" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerTextForegroundDisabled}" /> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CalendarGlyph" Storyboard.TargetProperty="Foreground"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerCalendarGlyphForegroundDisabled}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup x:Name="FocusStates"> <VisualState x:Name="Unfocused" /> <VisualState x:Name="PointerFocused" /> <VisualState x:Name="Focused"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Background" Storyboard.TargetProperty="Background"> <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource CalendarDatePickerBackgroundFocused}" /> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> <VisualStateGroup x:Name="SelectionStates"> <VisualState x:Name="Unselected" /> <VisualState x:Name="Selected"> <VisualState.Setters> <Setter Target="Placeholder.(UIElement.Visibility)" Value="Collapsed" /> <Setter Target="DateText.(UIElement.Visibility)" Value="Visible" /> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <FlyoutBase.AttachedFlyout> <Flyout Placement="Bottom"> <Flyout.FlyoutPresenterStyle> <Style TargetType="FlyoutPresenter"> <Setter Property="Padding" Value="0" /> <Setter Property="BorderThickness" Value="0" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="FlyoutPresenter"> <ContentPresenter Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTransitions="{TemplateBinding ContentTransitions}" Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> </ControlTemplate> </Setter.Value> </Setter> </Style> </Flyout.FlyoutPresenterStyle> <CalendarView x:Name="CalendarView" Style="{TemplateBinding CalendarViewStyle}" MinDate="{TemplateBinding MinDate}" MaxDate="{TemplateBinding MaxDate}" IsTodayHighlighted="{TemplateBinding IsTodayHighlighted}" DisplayMode="{TemplateBinding DisplayMode}" FirstDayOfWeek="{TemplateBinding FirstDayOfWeek}" DayOfWeekFormat="{TemplateBinding DayOfWeekFormat}" CalendarIdentifier="{TemplateBinding CalendarIdentifier}" IsOutOfScopeEnabled="{TemplateBinding IsOutOfScopeEnabled}" IsGroupLabelVisible="{TemplateBinding IsGroupLabelVisible}" /> </Flyout> </FlyoutBase.AttachedFlyout> <ContentPresenter x:Name="HeaderContentPresenter" x:DeferLoadStrategy="Lazy" Margin="{ThemeResource ComboBoxHeaderThemeMargin}" Visibility="Collapsed" Content="{TemplateBinding Header}" ContentTemplate="{TemplateBinding HeaderTemplate}" TextWrapping="Wrap" /> <Border x:Name="Background" Grid.Row="1" Grid.ColumnSpan="2" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" /> <TextBlock x:Name="DateText" HorizontalAlignment="Left" Foreground="{ThemeResource CalendarDatePickerTextForegroundSelected}" Grid.Row="1" FontSize="15" Padding="12, 0, 0, 2" VerticalAlignment="Center" Visibility="Collapsed" /> <TextBlock x:Name="Placeholder" HorizontalAlignment="Left" Foreground="{ThemeResource CalendarDatePickerTextForeground}" Text="{TemplateBinding PlaceholderText}" Grid.Row="1" FontSize="15" Padding="12, 0, 0, 2" VerticalAlignment="Center" /> <FontIcon x:Name="CalendarGlyph" Glyph="&#xE787;" FontFamily="{ThemeResource SymbolThemeFontFamily}" Foreground="{ThemeResource CalendarDatePickerCalendarGlyphForeground}" Grid.Row="1" Grid.Column="1" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> 更新。

以下是供您参考的完整副本。

$data = '1.jpg,2.jpg,3.jpg,4.jpg,5.jpg,6.jpg,7.jpg,';
$new_leader='4.jpg';

echo strstr($data,$new_leader),strstr($data,$new_leader,true);