尽管在这个论坛上有一些帖子,还有一些我找不到可以告诉我如何把重点放在博客上的东西TextBox
。
我有一个带有许多标签和文本框的userControl。加载表单时,我希望特定的textBox具有焦点。
我已经设置了tabIndex,但是似乎没有用。
有什么建议?
Answers:
您可以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内的网格中有一个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中可见。我认为必须给FocusScope焦点,FocusManager.FocusedElement属性才能起作用。
杰瑞