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里面的TextBlock UserControl,默认背景变

  • 第二步:点击' Deactive UserControl'按钮,text1 背景变浅

  • 第三步:点击“ Active UserControl”按钮,然后...

我希望text1背景更改为更深这意味着 UserControl 已被聚焦/激活

我怎样才能做到这一点?

4

1 回答 1

1

如果您想将焦点设置为UserControlButton“Active UserControl”)被按下时,我们可以添加一个 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 回答