關閉ContentDialog上的「Enter」我一直在試圖讓一個簡單的ContentDialog
與TextBox
關閉當用戶點擊在TextBox
輸入同時還。可悲的是,即使ContentDialog響應Esc,即使沒有TextBox
也不能正常工作。如何UWP
我希望有一種方法可以從KeyDown
處理程序TextBox
的處理程序中設置結果,但似乎ContentDialog
缺少這個?!
關閉ContentDialog上的「Enter」我一直在試圖讓一個簡單的ContentDialog
與TextBox
關閉當用戶點擊在TextBox
輸入同時還。可悲的是,即使ContentDialog響應Esc,即使沒有TextBox
也不能正常工作。如何UWP
我希望有一種方法可以從KeyDown
處理程序TextBox
的處理程序中設置結果,但似乎ContentDialog
缺少這個?!
您可以關閉使用Hide()
方法ContentDialog在TextBox
KeyDown
處理程序,簡單的例子:
ContentDialog c = new ContentDialog();
var tb = new TextBox();
tb.KeyDown += (sender, args) =>
{
if (args.Key == VirtualKey.Enter)
{
c.Hide();
}
};
c.Content = tb;
c.ShowAsync();
編輯: 但它似乎更復雜,當你想關閉該對話框而不TextBox
。您需要申請開通全球Window.Current.CoreWindow.KeyDown
事件:
ContentDialog c = new ContentDialog();
Window.Current.CoreWindow.KeyDown += (sender, args) =>
{
if (args.VirtualKey == VirtualKey.Enter)
{
c.Hide();
}
};
c.ShowAsync();
這是我會得到我的一個ContentDialogResult.Primary
輸入
我將此添加到我的ContentDialog最終的解決方案:
public new IAsyncOperation<ContentDialogResult> ShowAsync()
{
var tcs = new TaskCompletionSource<ContentDialogResult>();
CaptionTB.KeyDown += (sender, args) =>
{
if (args.Key != VirtualKey.Enter) return;
tcs.TrySetResult(ContentDialogResult.Primary);
Hide();
args.Handled=true;
};
var asyncOperation = base.ShowAsync();
asyncOperation.AsTask().ContinueWith(task => tcs.TrySetResult(task.Result));
return tcs.Task.AsAsyncOperation();
}
不幸ShowAsync
是不是虛擬的,所以我不得不new
的功能。它對我來說效果不錯!
簡短的回答是,它沒有(乾淨)沒有解決方法和黑客,將保留識別哪個按鈕被按下的功能。長的答覆是,這是幸運的很乾淨,容易繼承ContentDialog
做正是我們想要的:
using System;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
namespace NeoSmart.Dialogs
{
class HotkeyContentDialog : ContentDialog
{
public new event TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> PrimaryButtonClick;
public new event TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> SecondaryButtonClick;
public ContentDialogResult Result { get; set; }
public new async Task<ContentDialogResult> ShowAsync()
{
var baseResult = await base.ShowAsync();
if (baseResult == ContentDialogResult.None)
{
return Result;
}
return baseResult;
}
protected override void OnKeyUp(KeyRoutedEventArgs e)
{
if (e.Key == Windows.System.VirtualKey.Enter)
{
Result = ContentDialogResult.Primary;
PrimaryButtonClick?.Invoke(this, default(ContentDialogButtonClickEventArgs));
Hide();
}
else if (e.Key == Windows.System.VirtualKey.Escape)
{
Result = ContentDialogResult.Secondary;
SecondaryButtonClick?.Invoke(this, default(ContentDialogButtonClickEventArgs));
Hide();
}
else
{
base.OnKeyUp(e);
}
}
}
}
只需使用HotkeyContentDialog
代替ContentDialog
和一切都會好的。
謝謝,這確實有效。我不知道爲什麼'Hide'不需要一個參數來設置'ShowAsync'的'ContentDialogResult'與'ContentDialogResult.None'不同的東西 –
c.Hide()可能會設置c之前的一個可能的改進。 tag = ContentDialogResult.Primary。對於VirtualKey.Escape,請設置c.tag = ContentDialogResult.Secondary。如果c.ShowAsync的結果是ContentDialogResult.None,那麼可以將結果推斷爲對話框的標籤,將其轉換爲ContentDialogResult。 – zax