【问题标题】:WPF, How to focus a TextBox element of an user control from another?WPF,如何从另一个用户控件的 TextBox 元素中聚焦?
【发布时间】:2021-03-06 08:46:03
【问题描述】:

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

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>

这是背后的 Materiales 代码:

public partial class OfMateriales : UserControl
{
    public OfMateriales()
    {
        InitializeComponent();
    }

    private void Button_GotFocus(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Ojo que siguiente tiene el foco");
    }

    private void MetroDataGrid_KeyUp(object sender, KeyEventArgs e)
    {
        Pesos uc = new Pesos();
        uc.BuscadorTexto.Text = "KK";
        uc.BuscadorTexto.Focus(); 
    }
}

如您所见,我尝试编辑 textBox 内容并设置焦点但完全没有效果。

【问题讨论】:

    标签: c# wpf xaml focus


    【解决方案1】:

    您必须创建一个针对Materiales 控件的新焦点范围。这样,Materiales 控件的子元素将不再从TextBox(或主焦点范围内的任何其他控件)窃取键盘焦点。

    您使用FocusManager 创建新的焦点范围:

    MainWindow.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>
    

    【讨论】:

    • 谢谢,让我有时间尝试一下,并将您的答案标记为正确答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多