5

Control から派生し、ControlTemplate を使用して定義されたカスタム コントロールを開発しています。すべての付加機能を取り除いた後、コントロールには 4 つの TextBox のみが表示されます。

<Style TargetType="{x:Type local:MyControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyControl}">
                <StackPanel Orientation="Horizontal">
                    <TextBox/>
                    <TextBox/>
                    <TextBox/>
                    <TextBox/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

問題は、コントロールがキーボード フォーカスを受け取り、それ自体 (TextBox の 1 つではなく、すべてのテキスト ボックス) の周りにフォーカス四角形を描画できることです。これにより、ウィンドウ内のコントロールをナビゲートするときに不要なタブ ストップが追加されます。

カスタム コントロールで (スタイルのセッターを使用して) Focusible を false に設定すると問題は解決しますが、このような解決策は完全にはほど遠いものです。そのコントロールを使用する開発者が Focusible を true に設定すると、タブ ストップの動作が台無しになる可能性があるからです。

コントロールの GotKeyboardFocus イベントに応答して、コントロール全体がフォーカスを受け取ったときに最初の TextBox にフォーカスを与えることができますが、(Shift+Tab を使用して) タブで戻ると、これは正しく機能しません。最初の TextBox がフォーカスを受け取ります。最後の TextBox を最初にフォーカスする必要があります。

カスタム コントロール全体がキーボード フォーカスを受け入れないようにするにはどうすればよいでしょうか。

4

1 に答える 1

0

実際の UserControl を作成し、そこでフォーカス管理をカプセル化します。Styleを介してXamlを実行すると、これまでのところしか得られないためです...

これは、UserControl の簡単なサンプル + メイン ウィンドウでの使用法/テストです。お気づきのとおり、フォーカスされた四角形は表示されなくなりました。簡単にするために、DataBindings / ViewModelなどは含めませんでした(あなたの質問はそれについてではなかったので)

<UserControl x:Class="WpfApplication1.MyControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         IsVisibleChanged="OnIsVisibleChanged" >
<StackPanel Orientation="Horizontal">
    <TextBox x:Name="txtA">txtA</TextBox>
    <TextBox>txtB</TextBox>
    <TextBox>txtC</TextBox>
    <TextBox>txtD</TextBox>
</StackPanel>

コードビハインドの最初のテキストボックスに変更された可視性にフォーカスを設定します

namespace WpfApplication1
{
public partial class MyControl : UserControl
{
    private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if (IsVisible && IsEnabled)
        {
            Keyboard.Focus(null);
            Keyboard.Focus(txtA);
        }
    }

    public MyControl()
    {
        InitializeComponent();
    }
}

}

私の小さなテストでは、MyControlタブだけを実行すると、他の2つのテキストボックスの間に配置されます。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">

<StackPanel>
    <TextBox>txt1</TextBox>
    <c:MyControl/>
    <TextBox>txt2</TextBox>
</StackPanel>

于 2013-08-01T16:44:03.543 に答える