Set the focus on a textbox in xaml wpf

后端 未结 9 928
走了就别回头了
走了就别回头了 2020-11-30 00:29

Despite some posts on this forum and others i cannot find something that tells me how to set the focus on a TextBox.

I have a userControl with many labe

相关标签:
9条回答
  • 2020-11-30 00:37

    I have a TextBox inside a Grid inside a DataTemplate which I want to have keyboard focus when it becomes visible. I also found that

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

    did not work for me.

    However when I call Focus() in the parent ContentControl

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

    it starts to work and the caret is visible in the TextBox. I think the FocusScope has to be given focus for the FocusManager.FocusedElement property to have any effect.

    Jerry

    0 讨论(0)
  • 2020-11-30 00:46

    From experimenting around, the xaml solution

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

    seems to work best when you place it in the highest element in the window hierarchy (usually Window, or the Grid you place everything else in)

    0 讨论(0)
  • 2020-11-30 00:49

    You can apply this property directly on the TextBox :

    <TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
    
    0 讨论(0)
  • 2020-11-30 00:51

    I am new to using WPF and reading through the above examples I had a similar experience trying set the focus to a textbox using the xaml code examples given, i.e. all the examples above didn't work.

    What I found was I had to place the FocusManager.FocusElement in the page element. I assume this would probably work as well if you used a Window as the parent element. Anyway, here is the code that worked for me.

     <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 讨论(0)
  • 2020-11-30 00:57

    For completeness, there is also a way to handle this from code behind (e.g. in the case of controls that, for whatever reason, are created dynamically and don't exist in XAML). Attach a handler to the window's Loaded event and then use the ".Focus()" method of the control you want. Bare-bones example below.

    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 讨论(0)
  • 2020-11-30 01:00

    bind the element you want to point the focus in as

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

    in grid or groupbox etc

    0 讨论(0)
提交回复
热议问题