WPF'de metin kutusuna odaklanın


105

Odak noktası nasıl TextBoxWPF'deki öğeye

Bu koda sahibim:

txtCompanyID.Focusable = true;
txtCompanyID.Focus();

...ama bu çalışmıyor.

Herhangi bir fikir?


txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); işe yarıyor ama bu nasıl.
MindRoasterMir

Yanıtlar:


146

XAML'de:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>

9
MVVM ile uyumlu olduğu için bu yaklaşımı yukarıdakilere tercih ediyorum.
Todd Sprang

1
Odaklanmış öğe salt okunurdur xaml'de nasıl ayarlanır? Bunu kullandım ve işe yaramadı <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK

@ user841612, aşağıdaki bağlantıyı kontrol edin ve Montaj ve Ad
Alanını

Bu yalnızca bir kez çalışır. Sayfa oluşturulduktan sonra odağı değiştirmek isterseniz, bunu programlı olarak yapmanız gerekir.
Joe Steele

bu da işe yarar. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir

51

Şu ana kadar kimse sorudaki kodun neden çalışmadığını açıklamadı. Benim tahminim, kodun Pencerenin yapıcısına yerleştirildiği yönünde. Ancak şu anda odaklanmak için henüz çok erken. Pencere etkileşime hazır olduğunda yapılması gerekir. Kod için en iyi yer Loaded olayıdır:

public KonsoleWindow() {
  public TestWindow() {
    InitializeComponent();
    Loaded += TestWindow_Loaded;
  }

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}

1
Mantıken doğru, çok fazla mücadeleden sonra bu cevap oldukça iyi ve çözüm olarak mükemmel.
shivani

bu benim için çalıştı. kabul edilen cevap olmadı. Teşekkürler
BoundForGlory

versiyon özgü, ama kesin değil eğer Focus()örneğin - Odak devlet parametresini gerektirirtxtCompanyId.Focus(FocusState.Keyboard)
Dan


26
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

Tüm masaüstünde klavye odağına sahip yalnızca bir öğe olabilir. WPF'de, klavye odağına sahip öğenin IsKeyboardFocused değeri true olarak ayarlanacaktır.

Ayar çizgisinden sonra kırılabilir ve IsKeyboardFocusedmülkün değerini kontrol edebilirsiniz . Ayrıca o çizgiye gerçekten ulaşıp ulaşmadığınızı da kontrol edin veya belki bundan sonra odaklanmak için başka bir unsur ayarlayın.


19

Bunu dene : MyTextBox.Focus ( );


2
Bu en zarif cevaptır ve ebeveyni de belirtmenizi gerektirmez. Bunun için teşekkürler, benim için harika çalışıyor!
dbeachy1

Peter Huber'in cevabı bunu yapıyor ancak önce pencerenin yüklenmesi gerektiğini açıklıyor, bu yüzden benimki çalışmıyordu
Adriaan Davel

14

StackPanel yerine ızgara kullandığım için bunların hiçbiri benim için işe yaramadı.

Sonunda şu örneği buldum: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

ve şu şekilde değiştirildi:

'Kaynaklar' bölümünde:

    <Style x:Key="FocusTextBox" TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

Izgara tanımımda:

<Grid Style="{StaticResource FocusTextBox}" />

3
Bu benim için de çalıştı. Gerisi değildi. Bağlantı için teşekkürler, bu oldukça ilginçti. Bu kadar basit bir şeyin bu kadar karmaşık olabilmesi de ilginç.
TravisWhidden

2
Yukarıdaki cevap, konteynerin Gird veya StackPanel olmasına bakılmaksızın iyi çalışıyor. Ağınızın yapısı net olmadığından, neyin yanlış gidebileceğini söylemek zordur. Yine de alternatifleri görmek güzel.
yararlıBee

1
Benim için bu aynı zamanda doğru çalışan tek kişi. İyi yol.
OregonGhost

7

Diğer cevaplarda çözümü bulamadıysanız, sorunu bu şekilde çözdüm.

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);

Anladığım kadarıyla, Focus()uygulama diğer bileşenleri oluşturmadan önce çağrı çağrıldığı için diğer çözümler çalışmayabilir .


3
Bu cevap daha iyi bir sıralamayı hak ediyor.
Simon Mourier

0

Diğer bir olası çözüm, ücretsiz DevExpress MVVM Framework tarafından sağlanan FocusBehavior'ı kullanmaktır :

<TextBox Text="This control is focused on startup">
    <dxmvvm:Interaction.Behaviors>
        <dxmvvm:FocusBehavior/>
    </dxmvvm:Interaction.Behaviors>
</TextBox>

Yüklendiğinde, belirli bir olay ortaya çıktığında veya bir özellik değiştirildiğinde bir kontrole odaklanmanızı sağlar.


0

Arkasındaki Kod'da bunu ancak bunu yaparak başarabilirsiniz.

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            txtIndex.Focusable = true;
            txtIndex.Focus();
        }

Not: Pencere yüklenmeden çalışmaz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.