2013-12-01 2 views
2

Я добавляю элемент управления WPF DatePicker в свою форму, и он отлично работает. Но я не хочу, чтобы пользователь мог вводить тип в текстовом поле «Выбрать дату». Я хочу, чтобы это было только для чтения, и когда они нажимают на текстовое поле, он просто открывает календарь.WPF C# DatePicker open calender on click

Я не был уверен, была ли опция для этого в свойствах? Я не мог найти что-нибудь ...

ответ

4
<DatePicker HorizontalAlignment="Left" VerticalAlignment="Top"> 
    <DatePicker.Resources> 
     <Style TargetType="DatePickerTextBox"> 
      <Setter Property="IsReadOnly" Value="True"/> 
      <Setter Property="Text" Value=" "/> 
      <Setter Property="Focusable" Value="False"/> 
      <Setter Property="IsEnabled" Value="False" /> 
      <Setter Property="IsHitTestVisible" Value="False"/> 
     </Style> 
    </DatePicker.Resources> 
</DatePicker> 

В дальнейшем вы можете использовать визуализатор WPF, чтобы увидеть, какие дочерние элементы управления управления верхнего уровня с использованием (в данном случае DatePickerTextBox), а затем применить стиль и/или шаблон для этого типа в разделе ресурсов, как это я сделал здесь.

+0

Большое спасибо за решение! Я буду использовать визуализатор WPF, если столкнутся с подобной проблемой. – user2868614

1

ответ Марк Фельдман является частично писать, он не ответил на то, как нажав на текстовое поле собирается открыть calendare всплывающее окно !,

ИМХО, вы должны подключить шаблон из datPiker, и увеличить размер кнопка так плохо перекрывает текстовое поле, и вы сделали, когда вы нажимаете на текстовом поле его кнопку, получить событие увидеть сильфонную часть модифицированного шаблона Datepiker:

<DatePickerTextBox Grid.Row="0" Grid.Column="0" x:Name="PART_TextBox" Focusable="{TemplateBinding Focusable}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"/> 
<Button Grid.Row="0" Grid.Column="0" x:Name="PART_Button" Foreground="{TemplateBinding Foreground}" Focusable="False" > 
    <Button.Template> 
     <ControlTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 
       <Border Background="Transparent"/> 
       <Button Grid.Column="1" HorizontalAlignment="Left" Foreground="{TemplateBinding Foreground}" Template="{StaticResource DropDownButtonTemplate}" VerticalAlignment="Top" Width="20" Margin="3,0,3,0" /> 
      </Grid> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 

Не забудьте добавить стиль DatePickerTextBox, описанный в ответе Марка Фельдмана