2010-09-03 33 views
6

Tôi đang cố gắng sử dụng tùy chỉnh TextBox trong điều khiển DatePicker, nhưng tôi không thể lấy ngày để ràng buộc từ lịch bật lên đến TextBox. Tôi không muốn phải phong cách toàn bộ DatePicker trừ khi tôi phải làm vậy, và DatePickerTextBox có quyền kiểm soát riêng của mình, vì vậy phải có cách để chỉ thay đổi nó. Đoạn code dưới đây là những gì tôi có là một sự khởi đầu:Tuỳ chỉnh WPF DatePickerTextBox Mẫu Trợ giúp

<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> 

Tôi có thể không được thực hiện các ràng buộc một cách chính xác, hoặc PART_TextBox không có thể đúng vì nó không phải là một phần của DatePicker mẫu riêng của mình.

Ai đó hãy trợ giúp! :)

Cảm ơn trước!

Trả lời

22

Hãy thử điều này:

<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

Đã nhận. Cảm ơn nhiều! –

+0

Tôi gặp vấn đề với điều này: nó không tôn trọng định dạng ngày/dài mà mẫu mặc định thực hiện. – dex3703

+3

@ dex3707 Bạn có thể thêm StringFormat vào Textbinding và chỉ định định dạng, ví dụ: Dominik

3

Tôi nhận ra điều này đã được trả lời trong một thời gian dài bây giờ, nhưng ràng buộc trực tiếp đến thuộc tính Text của s DatePicker sẽ cho phép TextBox trong mẫu kiểm soát của bạn để dễ dàng tôn vinh Ngắn/Định dạng dài được cung cấp bởi 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> 

"PART_TextBox" cũng không cần thiết vì nó không phải là một phần của mẫu DatePickerTextBox. Các bộ phận duy nhất mà các DatePickerTextBox chứa là:

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

private const string ElementContentName = "PART_Watermark"; 

và thừa hưởng từ TextBoxBase ...

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

internal const string ContentHostTemplateName = "PART_ContentHost"; 

Giải pháp thay thế: Nếu bạn chọn không tham gia sử dụng TextBox và sử dụng PHẦN thừa hưởng bạn sẽ có thể thay đổi DatePickerTextBox mà không thay đổi chức năng mặc định của điều khiển.

<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

Tôi đã dành hàng giờ để làm việc này, và sau đó Tôi tìm thấy câu trả lời của bạn được chôn vùi bên trong rất nhiều câu hỏi và câu trả lời. Của bạn là triển khai tốt nhất. Đồ tốt! – Tronald

Các vấn đề liên quan