이 포럼 및 다른 게시물에 대한 일부 게시물에도 불구하고 .NET에 초점을 맞추는 방법을 알려주는 내용을 찾을 수 없습니다 TextBox
.
많은 레이블과 텍스트 상자가있는 userControl이 있습니다. 양식이로드되면 특정 텍스트 상자에 포커스를두고 싶습니다.
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에서이 작업을 수행하지 않으려는 경우 코드 숨김에서 사용할 수도 있습니다 .
FocusManager
물건을 넣는 곳 )였습니다. 결국 저는 코드 숨김에서 해냈습니다.
이 속성을 TextBox에 직접 적용 할 수 있습니다.
<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
나는 WPF를 처음 사용하고 위의 예제를 읽었으며 주어진 xaml 코드 예제를 사용하여 텍스트 상자에 포커스를 설정하려고 시도한 비슷한 경험이있었습니다. 즉, 위의 모든 예제가 작동하지 않았습니다.
내가 찾은 것은 페이지 요소에 FocusManager.FocusElement를 배치해야한다는 것입니다. Window를 부모 요소로 사용했다면 이것이 아마 잘 작동 할 것이라고 가정합니다. 어쨌든, 여기 나를 위해 일한 코드가 있습니다.
<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>
초점을 맞추려는 요소를 다음과 같이 바인딩하십시오.
FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"
그리드 또는 그룹 상자 등
Nov 11 '14
". 그는 한 떠난지 오래 아담이 그의 코멘트 : 게시하기 전에
완전성을 위해 코드 뒤에서이를 처리하는 방법도 있습니다 (예 : 어떤 이유로 든 동적으로 생성되고 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();
}
}
용법:
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);
}
DataTemplate 내부의 Grid 내부에 TextBox가 있으며 표시 될 때 키보드 포커스를 원합니다. 나는 또한 발견했다
<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();
}
}
작동하기 시작하고 캐럿이 TextBox에 표시됩니다. FocusManager.FocusedElement 속성이 효과를 내려면 FocusScope에 포커스가 있어야한다고 생각합니다.
실내 변기