我在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已经过关注/激活。
我怎样才能做到这一点?
答案 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