2014-07-02 25 views
0

我正在使用默認的WPF Datepicker控件。我希望日曆在用戶選擇DP文本框時打開,以便更清楚地表明他們也可以使用日曆來選擇日期。但是,似乎只要DP的文本框獲得焦點,它也會關閉日曆彈出窗口。獲取DatePicker的日曆保持打開,而它的文本框的重點

如果我使用這個簡單的函數打開日曆,例如,日曆打開,然後關閉,然後發送InvalidOperationException:「無法在關閉的事件處理程序中重新打開彈出窗口。這意味着當日歷打開時需要關注焦點,然後文本框取回焦點並關閉彈出窗口,然後觸發錯誤。

private void DatePicker_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
    { 
     DatePicker d = sender as DatePicker; 
     d.IsDropDownOpen = true; 
    } 

任何想法如何制止這個混亂,只是有日曆彈出和選定的文本框和平生活?

回答

0

一個方法是創建一個包含下列元素的用戶控件:

<DatePickerTextBox x:Name="TextBox" GotFocus="DatePickerTextBox_GotFocus" LostFocus="DatePickerTextBox_LostFocus"/> 
<Button Click="Button_Click" Grid.Column="1">Pick</Button> 
<Popup x:Name="MyPopup" StaysOpen="True" PlacementTarget="{Binding ElementName=TextBox}"> 
    <Calendar Focusable="False"/> 
</Popup> 

和處理有關彈出自定義自己的邏輯。請注意,這不是一個簡單的任務,你將需要:

  • 提取原始的DatePicker日曆按鈕模板,使它看起來等同於原生控制
  • 處理,將關閉彈出各種活動(例如日曆的月視圖中的導航)

它確實爲您提供了進一步定製彈出窗口的好處。例如,在工作中使用的解決方案中,客戶在日曆中請求了「今日」按鈕。如果您認爲必須維持這種控制是值得的,我可以提供一些關於我們實施的細節,但如果這不適合您,我不會發布它們。

1

您需要在日曆設置StaysOpen="true"

使用混合製作的日期選擇控件模板,然後找到"PART_Popup"

<Popup x:Name="PART_Popup" 
      AllowsTransparency="True" 
      Placement="Bottom" 
      StaysOpen="true" />     
相關問題