簡體   English   中英

如何在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。 我將向您展示一種快速簡便的方法來獲得您所要求的功能,我只是想在這里反復說明這並不是幾乎所有時間的規范

要制定可行的解決方案,請對您的項目執行以下操作:

  1. 在解決方案資源管理器中右鍵單擊您的項目(假定您正在使用Visual Studio)
  2. “添加”“新項目...”。
  3. 選擇“窗口(WPF)”模板並命名。 從這里開始,我將其命名為CustomerInformationEntry
  4. 打開為我們創建的CustomerInformationEntry.xaml文件, 刪除 <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>

  1. FocusManager.FocusedElement="{Binding ElementName=TbxCompanyName}CustomerInformationEntry.xamlWindow元素中。
  2. 這是我們現在完成的視圖或視覺表示,剩下的就是從我們其他的Window或UserControl實例化一個新的CustomerInformationEntry,然后顯示它。 在這種情況下,我將在MainWindow.xaml上放置一個按鈕,並為其提供一個click事件,該事件將創建新Window的實例:
    • MainWindow.xaml中,添加<Button Name="BtnOpenCustomerInformationEntry" Content="Enter Customer Information" Click="OpenCustomerInformationEntry"/> 就我而言,我將在對象內部添加按鈕,盡管如果您已經創建了初始窗口,則可以將其放置在任意位置。
    • MainWindow.xaml.cs中,我們將添加一個新的私有方法,該方法將由新按鈕的Click事件使用。 添加以下代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM