[英]Programatically focus a UI element that was re-enabled in the prior statement
我正在開發一個表格,其中一個要求是在前兩個完成之前禁用大部分字段。 為了可用性起見,我希望它設置為在您從第二個字段 (Field_Two.LostFocus) 中選擇出來后,啟用、顯示字段的 rest,並聚焦第一個字段。 我目前擁有的代碼在啟動時將所有字段的可見性設置為 visibility.hidden。 它目前所做的是關注 Field_One (在啟用字段的選項卡順序中的下一個),但我已經確認條件已正確滿足並且執行繼續通過 return 語句。
Field.beenFocused 是我創建的一個變量,它被初始化為 false,然后在字段第一次聚焦時設置為 true,我的字段 class 擴展了 TextBox; 我所有的控件保存 Field_One 和 Field_Two 都在 Stackpanels 中。
C#
void Field_Two_LostFocus(object sender, RoutedEventArgs e)
{
if (!Field_Three.beenFocused)
{
if (String.IsNullOrWhiteSpace(Field_One.Text) || String.IsNullOrWhiteSpace(Field_Two.Text))
return;
foreach (object u in ApplicationGrid.Children)
if (u.GetType() == typeof(StackPanel))
((StackPanel)u).IsEnabled = true;
do { Field_Three.Focus(); }
while (!Field_Three.beenFocused);
}
}
您可以嘗試在TextChanged
事件中啟用/禁用,而不是在LostFocus
事件中。
這是一些示例代碼。
主窗口.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<TextBox Name="textBox1" TextChanged="ValidateInitialFieldsOnChange"
Height="23" Width="120" />
<TextBox Name="textBox2" TextChanged="ValidateInitialFieldsOnChange"
Height="23" Width="120" />
<TextBox Name="textBox3" IsEnabled="False" Height="23" Width="120" />
</StackPanel>
</Window>
MainWindow.xaml.cs:
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ValidateInitialFieldsOnChange(object sender,
TextChangedEventArgs e)
{
textBox3.IsEnabled = !string.IsNullOrWhiteSpace(textBox1.Text)
&& !string.IsNullOrWhiteSpace(textBox2.Text)
;
}
}
}
調整此代碼以適應您的場景將是相當簡單的,並且不需要手動設置焦點。 您可能可以改用標簽順序。
但是,如果跳位順序沒有幫助,您仍然可以使用這些方法的組合來解決問題。 在LostFocus
事件中設置焦點,並在TextChanged
事件中啟用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.