Stel de focus in op een tekstvak in xaml wpf

Ondanks sommige berichten op dit forum en andere kan ik niets vinden dat me vertelt hoe ik de focus op een TextBoxmoet zetten.

Ik heb een userControl met veel labels en tekstvakken. Wanneer het formulier is geladen, wil ik dat een bepaald tekstvak de focus heeft.

Ik heb de tabIndex ingesteld, maar dat leek niet te werken.

Heeft u suggesties?


Antwoord 1, autoriteit 100%

U kunt hiervoor de bijgevoegde eigenschap FocusManager.FocusedElementgebruiken. Hier is een stukje code dat de focus standaard op TxtB zet.

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

Je kunt ook TxtB.Focus()gebruiken in je code-behind als je dit niet in XAML wilt doen.


Antwoord 2, autoriteit 14%

U kunt deze eigenschap rechtstreeks op de TextBox toepassen:

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

Antwoord 3, autoriteit 4%

Ik ben nieuw in het gebruik van WPF en als ik de bovenstaande voorbeelden lees, had ik een soortgelijke ervaring toen ik de focus op een tekstvak probeerde te zetten met behulp van de gegeven xaml-codevoorbeelden, d.w.z. alle bovenstaande voorbeelden werkten niet.

Wat ik ontdekte, was dat ik de FocusManager.FocusElement in het pagina-element moest plaatsen. Ik neem aan dat dit waarschijnlijk net zo goed zou werken als je een Window als het bovenliggende element zou gebruiken. Hoe dan ook, hier is de code die voor mij werkte.

<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>

Antwoord 4

Ik heb een tekstvak in een raster in een gegevenssjabloon waarvan ik de toetsenbordfocus wil hebben wanneer het zichtbaar wordt. Dat vond ik ook

<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>

werkte niet voor mij.

Als ik echter Focus() aanroep in de bovenliggende ContentControl

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

het begint te werken en het dakje is zichtbaar in de TextBox. Ik denk dat de FocusScope focus moet krijgen voordat de eigenschap FocusManager.FocusedElement enig effect heeft.

Jerry


Antwoord 5

Van wat experimenteren, de xaml-oplossing

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

lijkt het beste te werken als je het in het hoogste element in de vensterhiërarchie plaatst (meestal Venster, of het raster waarin je al het andere plaatst)


Antwoord 6

Gebruik:
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);
    }

Other episodes