Odağı xaml wpf'de bir metin kutusuna ayarlayın


92

Bu forumdaki ve diğerlerindeki bazı gönderilere rağmen, bana nasıl odaklanacağımı söyleyen bir şey bulamıyorum TextBox.

Birçok etiket ve metin kutusu içeren bir userControl'üm var. Form yüklendiğinde, belirli bir metin kutusunun odağa sahip olmasını istiyorum.

TabIndex'i ayarladım ama bu işe yaramadı.

Herhangi bir öneri?


Yanıtlar:


178

Sen kullanabilirsiniz FocusManager.FocusedElementBu amaçla ekli özelliği. Varsayılan olarak odağı TxtB'ye ayarlayan bir kod parçası.

<StackPanel Orientation="Vertical" FocusManager.FocusedElement="{Binding ElementName=TxtB}">
    <TextBox x:Name="TxtA" Text="A" />
    <TextBox x:Name="TxtB" Text="B" />
</StackPanel>

TxtB.Focus()XAML'de bunu yapmak istemiyorsanız, arka planda kodunuzda da kullanabilirsiniz .


13
@TarkaDaal: "Benim için işe yaramadı" yorumu biraz daha ayrıntılı olabilirdi. Muhtemelen odağı çalan başka bir kontroldür. WPF'de odak savaşı başladığında, işler yaramaz olmaya meyillidir! Lütfen kontrollerinizi ve şu anda görsel ağaçta nerede olduğunuzu doğrulayın (örneğin, bir ComboBox şablonu içinde, bunun bir etkisi olmayacak ve bunun gibi çok sayıda başka durum var). Çalan kişiyi bulamazsanız, odağı yüklendiğinde kontrole odaklamak için bir davranış veya arka plan kod kullanın.
Julien Lebosquain

@JulienLebosquain: Oldukça basit bir kontrol, iki düğme ve bir Grid içinde bir TextBox ( FocusManagermalzemeleri koyduğum yer ). Sonunda, arka plan kodunda yaptım.
TarkaDaal

"FocusedElement" üyesi tanınmıyor veya erişilemez. :( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/…
Hendy Irawan

@HendyIrawan Bu bir Silverlight projesi mi?
MojoFilter

@MojoFilter bu bir Windows Phone 8 WPF projesi
Hendy Irawan

26

Bu özelliği doğrudan TextBox üzerinde uygulayabilirsiniz:

<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>

17
Çalışma yaptı kabın üzerine FocusManager.FocusedElement = "{Binding ElementName = TxtB}" ayarı, iş için beni vermedi
Grant

1
Bir cazibe gibi çalışır ve herhangi bir isim gerektirmez.
Simon Mattes

1
Benim için de çalışmadı. Bir şey mi kaçırıyoruz?
BrunoLM

1
Benim için de işe yaramadı. Julien Lebosquain çalışmasının önerisi.
Crypt32

1
Benim için de çalışmıyor. Önerilen diğer tüm yöntemler de çalışmıyor. Bu problem basit olmalı ve kolaylıkla çözülebilir olmalıdır .. Bu yüzden çoğu ppl wpf'yi sevmez.
IgorStack

6

WPF'yi kullanmada yeniyim ve yukarıdaki örnekleri okurken, verilen xaml kod örneklerini kullanarak odağı bir metin kutusuna ayarlamaya çalışırken benzer bir deneyim yaşadım, yani yukarıdaki tüm örnekler işe yaramadı.

Bulduğum şey FocusManager.FocusElement'i sayfa öğesine yerleştirmem gerektiğiydi. Ana öğe olarak bir Pencere kullandıysanız, bunun muhtemelen işe yarayacağını varsayıyorum. Her neyse, işte benim için çalışan kod.

 <Page x:Class="NameOfYourClass"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  mc:Ignorable="d"
  Title="Title" 
  Height="720"
  Width="915"
  Background="white"
  Loaded="pgLoaded"
  FocusManager.FocusedElement="{Binding ElementName=NameOfYourTextBox}">

  <!-- Create child elements here. -->

  </Page>

0

odağı işaret etmek istediğiniz öğeyi bağlama

FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"

ızgara veya grup kutusunda vb.


4
Evet, herkesin verdiği cevabı verdiğiniz için teşekkürler ... 4 yıl sonra ...
Adam Plocher

4
@AdamPlocher Güzel bir, Sulfian'ı Stack Overflow'dan kalıcı olarak çıkardınız. "Yığın taşmasına hoş geldiniz" mesajı daha uygun olurdu.
Contango

2
@Contango: "Son görülme Nov 11 '14". O edildi çoktan gitmiş Adam yorumunu :) yayınlamadan önceki
Gone Kodlama

0

FocusManager akıllıca değildi ve bu beni biraz şaşırttı. Sadece tüm özelliği yazdım ve işe yaradı.

FocusManager.FocusedElement = "{Binding ElementName = MyTextBox}"


Microsoft Visual Studio Enterprise 2015 sürüm 14.0.23107.0/C#/WPF


0

Tamlık için, bunu arka planda kodlamanın bir yolu da vardır (örneğin, herhangi bir nedenle dinamik olarak yaratılan ve XAML'de mevcut olmayan kontroller durumunda). Pencerenin Loaded olayına bir işleyici ekleyin ve ardından istediğiniz denetimin ".Focus ()" yöntemini kullanın. Aşağıdaki çıplak kemik örneği.

public class MyWindow
{
    private VisualCollection controls;
    private TextBox textBox;

    // constructor
    public MyWindow()
    {
        controls = new VisualCollection(this);
        textBox = new TextBox();
        controls.Add(textBox);

        Loaded += window_Loaded;
    }

    private void window_Loaded(object sender, RoutedEventArgs e)
    {
        textBox.Focus();
    }
}

0

Xaml çözümü, etrafındaki deneylerden

FocusManager.FocusedElement="{Binding ElementName=yourElement}"

pencere hiyerarşisindeki en yüksek öğeye yerleştirdiğinizde en iyi şekilde çalışıyor gibi görünüyor (genellikle Pencere veya diğer her şeyi yerleştirdiğiniz Izgara)


0

Kullanım: local:FocusManager.FocusOnLoad="True"

    public class FocusManager
    {
        public static readonly DependencyProperty FocusOnLoad = DependencyProperty.RegisterAttached(
            "FocusOnLoad",
            typeof(bool),
            typeof(FocusManager),
            new UIPropertyMetadata(false, new PropertyChangedCallback(OnValueChanged))
            );

        private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            if (!(sender is Control control))
                return;

            if ((bool) e.NewValue == false)
                return;

            control.Loaded += (s, e) => control.Focus();
        }

        public static bool GetFocusOnLoad(DependencyObject d) => (bool) d.GetValue(FocusOnLoad);

        public static void SetFocusOnLoad(DependencyObject d, bool value) => d.SetValue(FocusOnLoad, value);
    }

0

Bir DataTemplate içindeki Grid içinde, görünür hale geldiğinde klavye odağına sahip olmak istediğim bir TextBox var. Ben de buldum

<DataTemplate x:Key="DistanceView" DataType="{x:Type vm:ROI}">
    <Grid FocusManager.FocusedElement="{Binding ElementName=tbDistance}">
        <TextBox x:Name="tbDistance" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom"/>
    </Grid>
</DataTemplate>

benim için çalışmadı.

Ancak üst ContentControl'de Focus () öğesini çağırdığımda

private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if ((sender as ContentControl).IsVisible)
    {
        (sender as ContentControl).Focus();
    }
}

çalışmaya başlar ve düzeltme işareti TextBox'ta görünür. FocusManager.FocusedElement özelliğinin herhangi bir etkiye sahip olması için FocusScope'a odak verilmesi gerektiğini düşünüyorum.

Jerry

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.