![](/img/trans.png)
[英]How do I program a “flash” effect when updating text boxes in a windows form with C#?
[英]How do I tab between text boxes on a form in C#?
一旦用戶輸入了上一個文本框的數據,我就會嘗試將功能切換到下一個文本框。 例如,一旦他們填寫了公司名稱,我希望能夠點擊Tab並將焦點放在下一個文本框“ Job Name”上。 這是在代碼或表單屬性中完成的嗎?
這是我的一些代碼。 我不確定如何在其中嵌套KeyEventsArgs
,這就是我看到其他人使用KeyPress
函數將焦點設置到下一個文本框的方式。
private void textBox1_TextChanged(object sender, EventArgs e)
{
CompanyName = textBox1.Text;
textBox1.AcceptsTab = true;
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
JobName = textBox2.Text;
textBox2.AcceptsTab = true;
}
從您提出的問題和提供的代碼示例來看,您的方法與所需功能之間似乎有些脫節。
因為您希望用戶能夠使用Tab鍵來在窗口中的元素之間切換鍵盤焦點,所以您只需要在每個TextBox控件上提供一個TabIndex屬性。 無需使用TextChanged事件即可實現此目的,為簡便起見,它可以完全在XAML中完成。
根據我對您問題的理解,您的下一個后續步驟可能是:
應用程序啟動時,最初如何將焦點集中在控件上?
為了解決這個問題,有幾種可用的替代方法,其中最簡單的是FocusManager的形式,我再次說明了XAML中的用法。
為方便起見,這是僅XAML的實現,其中實現了TabIndex和FocusManager:
<Window x:Class="tab_navigation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:tab_navigation"
mc:Ignorable="d"
Title="MainWindow" ResizeMode="NoResize" SizeToContent="WidthAndHeight" FocusManager.FocusedElement="{Binding ElementName=TbxCompanyName}">
<Grid Margin="10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical" Margin="0,0,0,10">
<Label Content="Company Name:" Target="{Binding ElementName=TbxCompanyName}" />
<TextBox Name="TbxCompanyName" TabIndex="0" Width="160" HorizontalAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Vertical">
<Label Content="Job Description:" Target="{Binding ElementName=TbxJobDescription}"/>
<TextBox Name="TbxJobDescription" TabIndex="1" Width="160" HorizontalAlignment="Left"/>
</StackPanel>
</StackPanel>
</Grid>
如果您需要任何進一步的幫助,請給我喊一聲,盡管我強烈建議您首先檢查一些MSDN資源,尤其是那些與Focus有關的資源
更新 :為了回應有關實施該解決方案的評論,WPF具有與WinForms不同的設計和最佳實踐。 我強烈建議您停止使用Forms,而在WPF項目中使用Window或UserControl派生類代替Form,除非有非常非常好的理由。 如果繼續在WPF項目中使用Form,則確實需要在該Form中實現自己的鍵盤導航邏輯,並彌合在嘗試使Form表現為通常可接受的情況時不可避免地遇到的其他各種差距。方式。 相反,我將向您展示如何使用Window或UserControl元素,在僅WPF中使用客觀上更好,更合適的方法來實現您的請求。 這里還有完整的解決方案zip可下載 。
WPF在設計上比WinForms模塊化得多,並且默認情況下可以很好地拆分關注區域,盡管大多數開發人員都在此基礎上實現了設計模式。 MVVM是WPF的當前寵兒,盡管確實超出了您的問題范圍,但確實為項目增加了很多價值,因此我將根據如何最大程度地實現請求來解決問題本身。基本形式。 請注意,盡管這不是完全理想的解決方案,但是如果您還不熟悉WPF,我強烈建議您學習和實現MVVM模式。
有了這樣的免責聲明,與其在WPF中使用Form,不如讓它成為從Window派生的類更為有用。 在WPF中,更常見的情況是您希望擁有一個窗口,其內容在不同視圖之間變化,而不是說創建多個窗口,盡管這再次超出了問題的范圍,並且將依賴於閱讀Binding和MVVM。 我將向您展示一種快速簡便的方法來獲得您所要求的功能,我只是想在這里反復說明這並不是幾乎所有時間的規范 。
要制定可行的解決方案,請對您的項目執行以下操作:
<Grid></Grid>
標記,然后從上面已經提供的XAML位置復制/粘貼此摘錄: <Grid Margin="10"> <StackPanel Orientation="Vertical"> <StackPanel Orientation="Vertical" Margin="0,0,0,10"> <Label Content="Company Name:" Target="{Binding ElementName=TbxCompanyName}" /> <TextBox Name="TbxCompanyName" TabIndex="0" Width="160" HorizontalAlignment="Left"/> </StackPanel> <StackPanel Orientation="Vertical"> <Label Content="Job Description:" Target="{Binding ElementName=TbxJobDescription}"/> <TextBox Name="TbxJobDescription" TabIndex="1" Width="160" HorizontalAlignment="Left"/> </StackPanel> </StackPanel> </Grid>
FocusManager.FocusedElement="{Binding ElementName=TbxCompanyName}
到CustomerInformationEntry.xaml的Window元素中。 <Button Name="BtnOpenCustomerInformationEntry" Content="Enter Customer Information" Click="OpenCustomerInformationEntry"/>
。 就我而言,我將在對象內部添加按鈕,盡管如果您已經創建了初始窗口,則可以將其放置在任意位置。 private void OpenCustomerInformationEntry(object sender, RoutedEventArgs e) { CustomerInformationEntry myWindow = new CustomerInformationEntry(); myWindow.Show(); }
就是這樣,您現在在MainWindow.xaml中有一個按鈕,單擊該按鈕時將使用MainWindow.xaml.cs中定義的OpenCustomerInformationEntry方法,該方法又將成為CustomerInformationEntry窗口的實例並顯示它。
如果您仍然願意使用Forms方法,則可以使用WindowsFormsHost來實現 , 此處將討論其用法。
最好的問候,JC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.