如何在包装器外激活UserControl?

时间:2013-08-26 10:02:28

标签: wpf xaml user-controls

我在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>
  • 第1步:点击text1内的UserControl TextBlock,然后默认为 背景更改为更深

  • 第2步:点击“Deactive UserControl”按钮,即text1背景 转为更轻

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

我希望text1背景更改为更深,这意味着UserControl已经过关注/激活

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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时,Focus将切换到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获得焦点时,它会将焦点移动到其中的下一个元素,这将是您最初点击的元素。

您可以使用以下代码调整代码演示:Here