WPFTOOLKIT DATEPICKERがRETURNキーダウンイベントを食べるのはなぜですか?
-
14-10-2019 - |
質問
DatePickerが標準キーをParent Controlのキーダウンルーティングイベントに渡す理由を誰かが知っているのではないかと思っていますが、リターンキーはありませんか?
これが私が書いたXAMLです:
<WrapPanel Name="_wpParameters"
Grid.Row="0" Grid.Column="0"
Orientation="Horizontal"
Grid.IsSharedSizeScope="True"
Keyboard.KeyDown="_wpParameters_KeyDown" >
<!-- this is where the dynamic parameter controls will be added -->
</WrapPanel>
これが私が返品キーをチェックするために使用していたコードです。
private void _wpParameters_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Return)
{
RaiseEvent(new RoutedEventArgs(LoadLiveResultsEvent, this));
}
}
私は事故でキーダウンを使用していました(キーアップを使用することを目的としています)が、標準の数値および /キャラクターがロジックを発射しているが、リターンキーではないことが興味深いことがわかりました。リターンキーがキーダウンキーとして含まれていない理由はありますか?
解決
キーダウンイベントは、特定のコントロールで予想どおりに動作しない可能性のある低レベルのテキスト入力イベントです。これは、一部のコントロールには、テキスト入力処理および関連イベントの高レベルバージョンを提供するコントロールコンポジットまたはクラス処理があるためです。
見たように MSDN...私の仮定は、コントロールがイベントを消費し、おそらくバインド可能なソースやその他のクリーンアップにテキストをコミットし、処理されたとおりにイベントをマークすることです。
他のヒント
さらに、私の解決策に言及する必要がありました。すべての子供ビューモデルからキーダウンイベントを処理する親ビューがありました。 PreviewKeyDownトンネルイベントをキャッチし、キーダウンバブルイベントを上げる、DatePicker、MaskedTextboxなどの特別なコントロールの動作を宣言しました。
public class EnterPressedBehavior : Behavior<UIElement>
{
public ICommand EnterPressedCommand { get; private set; }
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PreviewKeyDown += EnterPressed;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.PreviewKeyDown -= EnterPressed;
}
private void EnterPressed(object sender, KeyEventArgs keyEventArgs)
{
if (Keyboard.PrimaryDevice != null && Keyboard.PrimaryDevice.ActiveSource != null)
{
var eventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, keyEventArgs.Key) { RoutedEvent = UIElement.KeyDownEvent };
AssociatedObject.RaiseEvent(eventArgs);
}
}
}
DatePickerに割り当てられたこの動作:
<DatePicker x:Name="BirthDateDatePicker" Grid.Column="1"
Grid.Row="6" Margin="3" HorizontalAlignment="Stretch"
IsEnabled="{Binding PersonFieldsEditDenied}"
Validation.ErrorTemplate="{StaticResource DefaultValidationTemplate}"
AutomationProperties.AutomationId="BirthDateDatePicker">
<i:Interaction.Behaviors>
<viewModels:EnterPressedBehavior />
</i:Interaction.Behaviors>
</DatePicker>
親の見解によって聞かれる:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title=""
KeyDown="OnKeyDownHandler">
背後のコード:
private void OnKeyDownHandler(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
// your code
}
}
所属していません StackOverflow