このフォーラムや他のいくつかの投稿にもかかわらず、私はに焦点を合わせる方法を教えてくれる何かを見つけることができませんTextBox
。
多くのラベルとtextBoxを持つuserControlがあります。フォームが読み込まれると、特定の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でこれを実行しない場合は、コードビハインドで使用することもできます。
FocusManager
もの)でした。最後に、コードビハインドでそれを行いました。
このプロパティはTextBoxに直接適用できます。
<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
私はWPFを使用するのが初めてで、上記の例を読んでいます。同様の経験で、与えられたxamlコードの例を使用してテキストボックスにフォーカスを設定しようとしました。つまり、上記の例はすべて機能しませんでした。
私が見つけたのは、FocusManager.FocusElementをページ要素に配置する必要があることでした。親要素としてウィンドウを使用した場合、これもおそらく機能すると思います。とにかく、ここに私のために働いたコードがあります。
<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に表示されます。FocusManager.FocusedElementプロパティが効果を発揮するには、FocusScopeにフォーカスを与える必要があると思います。
ジェリー