2

Focusで関連する問題に遭遇しましたUserControl:

次のような UserControl があるとします。

<UserControl x:Class="_20130826.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <ListBox>
            <ListBoxItem>
                <TextBlock Text="text1" />
            </ListBoxItem>
            <ListBoxItem>
                <TextBlock Text="text2" />
            </ListBoxItem>
            <ListBoxItem>
                <TextBlock Text="text3" />
            </ListBoxItem>
            <ListBoxItem>
                <TextBlock Text="text4" />
            </ListBoxItem>
        </ListBox>
    </StackPanel>
</UserControl>

そして、MainWindow.xamlこのような:

<Window x:Class="_20130826.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:temp="clr-namespace:_20130826"
        Title="MainWindow">
    <StackPanel>
        <Button Content="Deactive UserControl" />
        <StackPanel>
            <Button Name="Button1" Content="Active UserControl" />
            <ContentControl>
                <temp:UserControl1 />
            </ContentControl>
        </StackPanel>
    </StackPanel>
</Window>
  • text1ステップ 1:内の TextBlock をクリックし、デフォルトで背景をより深いUserControl色に変更します。

  • ステップ 2: [ Deactive UserControl] ボタンをクリックすると、text1 の背景が明るくなります。

  • ステップ 3: [ Active UserControl] ボタンをクリックしてから ...

text1背景を deep に変更したい、つまり UserControl が focus/actived になっていることを意味ます。

どうすればこれを達成できますか?

4

1 に答える 1

1

UserControl("Active UserControl") が押されたときにフォーカスを設定する場合はButton、Click イベント ハンドラーを追加して、フォーカスを UserControl に割り当てることができます。

次のように言います。

<Window x:Class="_20130826.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:temp="clr-namespace:_20130826"
        Title="MainWindow">
    <StackPanel>
        <Button Content="Deactive UserControl" />
        <StackPanel>
            <Button Name="Button1" Content="Active UserControl" Click="Button1_OnClick" />
            <ContentControl>
                <temp:UserControl1 x:Name="myUserControl" />
            </ContentControl>
        </StackPanel>
    </StackPanel>
</Window>

とでMainWindow.xaml.cs

private void Button1_OnClick(object sender, RoutedEventArgs e) {
  FocusManager.SetFocusedElement(this, myUserControl);
}

「Active UserControl」をクリックするとButton、フォーカスが に切り替わりUserControlます。ListBoxItemただし、まだフォーカスがないため、「より深い」状態にはなりません。だからそれを並べ替えるために

加えUserControl1.xaml.csて:

protected override void OnGotFocus(RoutedEventArgs e) {
  base.OnGotFocus(e);

  if (!Equals(e.OriginalSource, this))
    return;
  TraversalRequest tRequest = new TraversalRequest(FocusNavigationDirection.Next);
  MoveFocus(tRequest);
}

これが何をするかというと、UserControlがフォーカスを取得すると、その中の次の要素 (最初にクリックした要素) にフォーカスが移動します。

これで微調整されたコードのデモを入手できます:ここ

于 2013-08-26T10:45:18.410 に答える