XAML 如何使用net maui在用户控件中设置control.focus

esbemjvw  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在使用Net Maui,在控件中设置焦点时遇到了问题。我创建了一个ContentView,其中包含1个标签和3个条目,我的代码是:

<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="NautorStar.MisControles.HoraControl">
    <ContentView.ControlTemplate>
        <ControlTemplate>

    <HorizontalStackLayout Margin="10,10,10,10" HorizontalOptions="Center">
        <Label x:Name="lblHora"
               Text="Hora Reloj Bitacora "
               FontSize="16"
               VerticalOptions="Center"
               HorizontalOptions="Center"/>
        <Entry x:Name="enHoras"
               Text = "{TemplateBinding HoraIntroducida}"
               Completed="Horas_Completed"
               HeightRequest="40"
               HorizontalTextAlignment="End"                  
               Keyboard="Numeric"
               Margin="5,0,5,0"
               MaxLength="2"

                WidthRequest="40"/>
        <Entry x:Name="enMinutos"
               Text = "{TemplateBinding MinutosIntroducidos}"    
               Completed="Minutos_Completed"
               HeightRequest="40"
               HorizontalTextAlignment="End"
               Keyboard="Numeric"
               Margin="0,0,5,0"
               MaxLength="2"
               Placeholder="Minutos"                 

                WidthRequest="40"/>
        <Entry x:Name="enSegundos"
               Text = "{TemplateBinding SegundosIntroducidos}"     
               Completed="Segundos_Completed"
               HeightRequest="40"
               HorizontalTextAlignment="End"
               Keyboard="Numeric"
               Margin="0,0,5,0"
               MaxLength="2"
               Placeholder="Segundos"
               WidthRequest="40"/>
        
    </HorizontalStackLayout>
        </ControlTemplate>
    </ContentView.ControlTemplate>
</ContentView>

C#代码是

public partial class HoraControl : ContentView
{
    // Definimos las propiedades del control
    public string Titulo
    {
        get => GetValue(TituloPrperty) as string;
        set => SetValue(TituloPrperty, value);
    }
    public string HoraIntroducida
    {
        get => GetValue(HoraIntroducidaProperty) as string;
        set => SetValue(HoraIntroducidaProperty, value);
    }
    public string MinutosIntroducidos
    {
        get => GetValue(MinutosIntroducidosProperty) as string;
        set => SetValue(MinutosIntroducidosProperty, value);
    }
    public string SegundosIntroducidos
    {
        get => GetValue(SegundosIntroducidosProperty) as string;
        set => SetValue(SegundosIntroducidosProperty, value);
    }
    // Aceptar los nuevos valores
    public static BindableProperty TituloPrperty = BindableProperty.Create(nameof(Titulo), typeof(string), typeof(HoraControl));
    // Aceptar los nuevos valores de Hora
    public static BindableProperty HoraIntroducidaProperty = BindableProperty.Create(nameof(HoraIntroducida), typeof(string), typeof(HoraControl));
    // Aceptar los nuevos valores de Minutos
    public static BindableProperty MinutosIntroducidosProperty = BindableProperty.Create(nameof(MinutosIntroducidos), typeof(string), typeof(HoraControl));

    // Aceptar los nuevos valores de Minutos
    public static BindableProperty SegundosIntroducidosProperty = BindableProperty.Create(nameof(SegundosIntroducidos), typeof(string), typeof(HoraControl));

    public HoraControl()
    {
        InitializeComponent();
        HoraIntroducida = DateTime.Now.Hour.ToString();
        MinutosIntroducidos = DateTime.Now.Minute.ToString();
        SegundosIntroducidos = DateTime.Now.Second.ToString();
    }
    void Horas_Completed(System.Object sender, System.EventArgs e)
    {
        HoraIntroducida = ValidacionDatos.ValidarHora(HoraIntroducida);
        FindNextEntry();
        //enMinutos?.Focus();

    }
    void Minutos_Completed(System.Object sender, System.EventArgs e)
    {
        MinutosIntroducidos = ValidacionDatos.ValidarMinutos(MinutosIntroducidos);
        FindNextEntry();
        //enSegundos?.Focus();
    }
    void Segundos_Completed(System.Object sender, System.EventArgs e)
    {
        SegundosIntroducidos = ValidacionDatos.ValidarSegundos(SegundosIntroducidos);
    }
    // Buscar el siguiente Entry
    private Entry FindNextEntry()
    {
        var currentParent = this.Parent;
        if (currentParent is Layout layout)
        {
            int index = layout.Children.IndexOf(this);
            if (index >= 0 && index < layout.Children.Count - 1)
            {
                // Encontrar el siguiente Entry dentro del mismo Layout.
                for (int i = index + 1; i < layout.Children.Count; i++)
                {
                    if (layout.Children[i] is Entry nextEntry)
                    {
                        //return nextEntry;
                        nextEntry.Focus();
                    }
                }
            }
        }
        return null; // No se encontró ningún Entry siguiente válido.
    }
}

我的问题是我不能使用enMinutos?.Focus();因为我有一个错误,告诉我enMinutos在当前上下文中不存在。我尝试使用FindNextEntry,但总是返回null,因为没有找到Entry。有什么想法可以把重点放在下一个条目上吗?谢谢

xurqigkl

xurqigkl1#

从contentview的代码后面引用控件模板的部分是不可能的,因为需要模板的唯一情况是它可能被不同的模板替换。
从其他地方的代码替换模板将崩溃任何试图访问原始模板部分的代码
如果您需要替换模板,请添加此ContentView的所有使用问题。一定有别的方法可以达到你的目标。

如果你不需要替换模板,那么解决方法就是不在模板中定义这些元素。
ContentView可以有任何内容;您显示的元素可以直接添加到ContentView中,而无需 Package 在ControlTemplate中:

<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="NautorStar.MisControles.HoraControl">
    <HorizontalStackLayout ..

相关问题