Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF,如何从另一个用户控件集中用户控件的文本框元素?_C#_Wpf_Xaml_Focus - Fatal编程技术网

C# WPF,如何从另一个用户控件集中用户控件的文本框元素?

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

我的窗口架构是一个Mainwindow.xaml,它包含许多用户控件,例如:Pesos.xaml和Materiales.xaml。问题是,当用户单击任何“Materiales.xaml”组件时,“Pesos.xaml”中的聚焦文本框元素将失去焦点。 我尝试添加一个公共属性,返回关于我感兴趣的“比索”用户控件的文本框,但没有成功。 对于我来说,当keyup事件被“materials”用户控件抛出时,焦点转到“Pesos”用户组件文本框。这是Pesos.cs.xaml,首先您可以看到BuscadorTexto公共属性,以便在用户控制之外访问它。其次,我有UserControl_GotFocus(),当从Materials用户控件接收到焦点时,由于DataContext为null,它将抛出一个异常:

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>