programing

xaml wpf의 텍스트 상자에 포커스 설정

sourcejob 2023. 5. 4. 19:53
반응형

xaml wpf의 텍스트 상자에 포커스 설정

이 포럼과 다른 포럼의 게시물들에도 불구하고 나는 나에게 초점을 맞추는 방법을 알려주는 것을 찾을 수 없습니다.TextBox.

많은 레이블과 textBox가 있는 사용자 컨트롤이 있습니다.폼이 로드되면 특정 텍스트 상자에 포커스를 둡니다.

제가 tabIndex를 설정했는데 작동하지 않는 것 같습니다.

좋은 의견이라도 있나?

사용할 수 있습니다.FocusManager.FocusedElement이 목적을 위한 부속 재산.다음은 기본적으로 TxtB로 포커스를 설정하는 코드입니다.

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

사용할 수도 있습니다.TxtB.Focus()XAML에서 이 작업을 수행하지 않으려면 코드백에 입력합니다.

이 속성을 텍스트 상자에 직접 적용할 수 있습니다.

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

저는 WPF를 사용하는 것이 처음이고 위의 예를 통해 읽었습니다. 저는 주어진 xaml 코드 예를 사용하여 텍스트 상자에 포커스를 설정하려고 시도한 유사한 경험이 있습니다. 즉, 위의 모든 예가 작동하지 않았습니다.

Focus Manager를 배치해야 했습니다.페이지 요소의 포커스 요소입니다.이 방법은 Windows를 부모 요소로 사용하는 경우에도 사용할 수 있을 것입니다.어쨌든, 여기 제게 효과가 있었던 코드가 있습니다.

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

데이터 템플릿의 그리드 안에 텍스트 상자가 있으므로 표시될 때 키보드 포커스를 맞추려고 합니다.나는 또한 그것을 발견했습니다.

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

저한테는 안 통했어요.

그러나 상위 ContentControl에서 Focus()를 호출하는 경우

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

작업이 시작되고 캐럿이 텍스트 상자에 표시됩니다.Focus Scope는 Focus Manager에 초점을 맞춰야 한다고 생각합니다.효과를 낼 수 있는 포커스된 요소 특성입니다.

제리.

실험을 통해 본 xaml 솔루션은

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

창 계층 구조에서 가장 높은 요소(일반적으로 창 또는 다른 모든 요소를 배치하는 그리드)에 배치할 때 가장 잘 작동하는 것 같습니다.

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

Focus Manager는 지능적이지 못했고 이것은 저를 약간 혼란스럽게 했습니다.속성 전체를 입력했는데 작동했습니다.

포커스 매니저.FocusedElement="{BindingElementName=MyTextBox}"


Microsoft Visual Studio Enterprise 2015 버전 14.0.23107.0/C#/WPF

완전성을 위해 코드 뒤에서 이를 처리하는 방법도 있습니다(예: 어떤 이유로든 동적으로 생성되고 XAML에 존재하지 않는 컨트롤의 경우).윈도우의 Loaded 이벤트에 핸들러를 연결한 다음 "를 사용합니다.원하는 컨트롤의 Focus()" 메서드입니다.아래의 맨본 예제입니다.

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();
    }
}

포커스를 지정할 요소를 바인딩합니다.

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

그리드 또는 그룹 상자 등에서

22년 2월 4일에 대한 제 의견에 더해서, 저는 다음과 같이 해결했습니다.

XAML의 UserControl 정의에서 Loaded 이벤트 핸들러를 추가합니다. (Loaded= 뒤에 있는 탭은 자동으로 이벤트 핸들러를 뒤에 있는 코드에 추가합니다.)

그런 다음 코드 뒤에 있는 이벤트 핸들러를 편집합니다.

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    expressionTextBox.Focus();
}

WPF가 어느 시점에서 이벤트의 후킹을 처리할 수 있을 정도로 똑똑하기를 바라며, 클래스가 쓰레기 수집되고 메모리 누수가 발생하지 않기를 바라지만, 잘 모르겠습니다.저는 그것에 대한 어떤 의견이든 관심이 있습니다.

언급URL : https://stackoverflow.com/questions/2872238/set-the-focus-on-a-textbox-in-xaml-wpf

반응형