2010-09-03 8 views
6

Estoy intentando utilizar una costumbre TextBox en el control DatePicker, pero no puede obtener la fecha de obligar en el calendario emergente a la TextBox. No quiero tener que diseñar el DatePicker completo a menos que sea necesario, y el DatePickerTextBox tiene su propio control, por lo que debe haber una forma de solo modificarlo. El código siguiente es lo que tengo como punto de partida:WPF Plantilla de encargo DatePickerTextBox Ayuda

<Style TargetType="{x:Type DatePickerTextBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DatePickerTextBox}"> 
       <TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate}" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

no puede estar haciendo la unión correctamente o el PART_TextBox puede no ser adecuado ya que no es parte de la plantilla DatePicker sí.

Alguien por favor ayuda! :)

Gracias de antemano!

Respuesta

22

Trate de hacer esto:

<DatePicker> 
    <DatePicker.Resources> 
     <Style TargetType="{x:Type DatePickerTextBox}"> 
      <Setter Property="Control.Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <TextBox x:Name="PART_TextBox" 
            Text="{Binding Path=SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DatePicker.Resources> 
</DatePicker> 
+0

Eso lo tiene. ¡Muchas gracias! –

+0

Tengo un problema con esto: no respeta el formato de fecha corta/larga que tiene la plantilla predeterminada. – dex3703

+3

@ dex3707 Puede agregar StringFormat al Enlace de texto y especificar el formato, p. Dominik

3

Soy consciente de que ha sido contestada por un largo tiempo, pero uniéndose directamente a la propiedad Text del DatePicker 's a permitir la TextBox en su plantilla de control en honor fácilmente el Breve/Formato largo proporcionado por DatePicker.

<DatePicker> 
    <DatePicker.Resources> 
     <Style TargetType="{x:Type DatePickerTextBox}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <TextBox Text="{Binding Text, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DatePicker.Resources> 
</DatePicker> 

El "PART_TextBox" Tampoco es necesario porque no es parte de la plantilla DatePickerTextBox. Las únicas partes que la DatePickerTextBox contiene son:

[TemplatePart(Name = DatePickerTextBox.ElementContentName, Type = typeof(ContentControl))] 
public sealed partial class DatePickerTextBox : TextBox 

private const string ElementContentName = "PART_Watermark"; 

y heredado de TextBoxBase ...

[TemplatePart(Name = "PART_ContentHost", Type = typeof(FrameworkElement))] 
public abstract class TextBoxBase : Control 

internal const string ContentHostTemplateName = "PART_ContentHost"; 

Solución alternativa: Si se excluye el uso de la TextBox y utilizar la parte hereditaria que podrá alterar el DatePickerTextBox sin alterar la funcionalidad predeterminada del control.

<DatePicker> 
    <DatePicker.Resources> 
     <Style TargetType="{x:Type DatePickerTextBox}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Grid SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"> 
          <Border BorderThickness="{TemplateBinding BorderThickness}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            Background="{TemplateBinding Background}"/> 

          <ScrollViewer Name="PART_ContentHost" 
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DatePicker.Resources> 
</DatePicker> 
+0

He estado pasando horas en esto, y luego Encontré tu respuesta enterrada dentro de una plétora de preguntas y respuestas. La tuya es la mejor implementación. ¡Buen material! – Tronald