C# WPF,如何从另一个用户控件集中用户控件的文本框元素?
我的窗口架构是一个Mainwindow.xaml,它包含许多用户控件,例如:Pesos.xaml和Materiales.xaml。问题是,当用户单击任何“Materiales.xaml”组件时,“Pesos.xaml”中的聚焦文本框元素将失去焦点。 我尝试添加一个公共属性,返回关于我感兴趣的“比索”用户控件的文本框,但没有成功。 对于我来说,当keyup事件被“materials”用户控件抛出时,焦点转到“Pesos”用户组件文本框。这是Pesos.cs.xaml,首先您可以看到BuscadorTexto公共属性,以便在用户控制之外访问它。其次,我有UserControl_GotFocus(),当从Materials用户控件接收到焦点时,由于DataContext为null,它将抛出一个异常:C# WPF,如何从另一个用户控件集中用户控件的文本框元素?,c#,wpf,xaml,focus,C#,Wpf,Xaml,Focus,我的窗口架构是一个Mainwindow.xaml,它包含许多用户控件,例如:Pesos.xaml和Materiales.xaml。问题是,当用户单击任何“Materiales.xaml”组件时,“Pesos.xaml”中的聚焦文本框元素将失去焦点。 我尝试添加一个公共属性,返回关于我感兴趣的“比索”用户控件的文本框,但没有成功。 对于我来说,当keyup事件被“materials”用户控件抛出时,焦点转到“Pesos”用户组件文本框。这是Pesos.cs.xaml,首先您可以看到Buscador
public partial class Pesos : UserControl
{
public Pesos()
{
InitializeComponent();
}
bool txtPesoFocus = false;
public TextBox BuscadorTexto {
get { return this.txtBuscador; }
}
...
private void UserControl_GotFocus(object sender, RoutedEventArgs e)
{
if (!((ViewModel.PuestoViewModel)DataContext).IsMaterialValido.GetValueOrDefault())
this.txtBuscador.Focus();
else if (((ViewModel.PuestoViewModel)DataContext).IsMaterialValido.GetValueOrDefault()
&& ((ViewModel.PuestoViewModel)DataContext).SelectedBascula.Tipo == Comun.TipoMaquina.Manual)
txtPeso.Focus();
}
}
这是Materiales.cs:
<UserControl x:Class="A99.AsuaProducts.Ensayos.Controles.Puestos.OfMateriales"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:A99.AsuaProducts.Ensayos.Controles.Puestos"
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" >
<Grid>
<Grid.RowDefinitions>
...
</Grid.RowDefinitions>
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>
</Grid>
<DataGrid x:Name="MetroDataGrid"
ItemsSource="{Binding ListaOfIteracionMaterialesMaquina}"
SelectedItem="{Binding SelectedOfIteracionMaterial}"
Grid.Row="1"
Margin="2"
AutoGenerateColumns="False"
HeadersVisibility="All"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
CanUserResizeColumns="False"
IsReadOnly="True"
SelectionUnit="FullRow"
Focusable="False"
KeyUp="MetroDataGrid_KeyUp">
<DataGrid.Columns>
...
</DataGrid.Columns>
</DataGrid>
...
</UserControl>
如您所见,我试图编辑文本框内容并设置焦点,但没有任何效果。您必须创建一个新的焦点范围,以
materials
控件为目标。这样聚焦Materiales
控件的子元素就不会再从文本框(或主焦点范围内的任何其他控件)窃取键盘焦点
您可以使用FocusManager
创建新的焦点范围:
main window.xaml
<Window>
<StackPanel>
<TextBox />
<!--
A separate focus scope will prevent the user control
from stealing focus of any element inside the MainWindow focus scope
-->
<Materiales FocusManager.IsFocusScope="True" />
</StackPanel>
</Window>
谢谢,让我抽时间试试,并将您的答案标记为正确答案
<Window>
<StackPanel>
<TextBox />
<!--
A separate focus scope will prevent the user control
from stealing focus of any element inside the MainWindow focus scope
-->
<Materiales FocusManager.IsFocusScope="True" />
</StackPanel>
</Window>