2017-01-16 23 views
0

У меня естьПрисоединить DatePicker к другому элементу пользовательского интерфейса

<StackPanel Orientation="Horizontal"> 
    <Label Content="{Binding WidgetSubTitle}" Style="{StaticResource WidgetSubTitleStyle}" /> 

    <DatePicker SelectedDate="{Binding SelectedDate}"> 
     <DatePicker.Resources> 
      <Style TargetType="DatePickerTextBox"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
       <Setter Property="IsReadOnly" Value="True" /> 
      </Style> 
     </DatePicker.Resources> 
    </DatePicker> 
</StackPanel> 

который выглядит как

enter image description here

Я хотел бы избавиться от значка календаря и вместо того, чтобы «прикрепить» выбор даты для мой Label. Когда нажимается метка, я хочу открыть сборщик (который имеет двустороннюю привязку к свойству DateTime в моей модели просмотра). Я также могу заменить Label на кнопку, поэтому я могу воспользоваться ее командами, это не проблема.

Я не могу понять, как это сделать. Я видел решение, которое ставит Calendar в Popup, но это, кажется, усложняет мне все.

Единственное решение, которое я мог себе представить, - скрыть весь элемент управления DatePicker (видимость = свернуть), а при нажатии кнопки/метки включите видимость только всплывающей части календаря этого сборщика. Невозможно разобраться в стилях, хотя ...

ответ

1

Вы можете полностью изменить внешний вид элемента управления WPF, изменив его ControlTemplate. В этом случае вы можете определить пользовательский шаблон для элемента управления DatePicker, который в основном делает его похожим на кнопку, а затем определяет другой шаблон для Button, который делает его похожим на ярлык. Что-то вроде этого:

<DatePicker> 
    <DatePicker.Template> 
     <ControlTemplate TargetType="DatePicker"> 
      <Grid x:Name="PART_Root" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> 
       <Button x:Name="PART_Button"> 
        <Button.Template> 
         <ControlTemplate TargetType="Button"> 
          <Label Content="{Binding WidgetSubTitle}" Style="{StaticResource WidgetSubTitleStyle}" /> 
         </ControlTemplate> 
        </Button.Template> 
       </Button> 
       <Popup x:Name="PART_Popup" AllowsTransparency="True" Placement="Bottom" PlacementTarget="{Binding ElementName=PART_TextBox}" StaysOpen="False"/> 
      </Grid> 
     </ControlTemplate> 
    </DatePicker.Template> 
</DatePicker> 

Хорошая вещь об этом является то, что функциональность управления остается неизменным, даже если изменить его внешний вид.

1

Вам нужно будет написать собственный стиль для управления DatePicker. Это может выглядеть немного усложняющим для вас, а также решением, о котором вы упомянули, но это не так. Это одна из тех вещей, которые делают WPF такой большой, как есть.

В WPF ControlTemplates у вас обычно есть части, поэтому реализация Controll знает, что делать с элементом UI.

Для DatePicker у вас есть PART_Button и PART_TextBox, которые вам нужно будет подгонять под ваши нужды. То есть удалите фактическую кнопку и добавьте для нее ярлык.

Вы можете прочитать все, что вам нужно, включая отличный пример в msdn.

https://msdn.microsoft.com/en-us/library/ff468215(v=vs.110).aspx