You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xamarin Telerik RadPopup中取消Entry自动聚焦

问题:Telerik RadPopup打开时阻止Entry自动获取焦点

我正在使用包含Entry和CheckBox的Telerik RadPopup,打开该弹窗时Entry会自动获得焦点,但我希望弹窗打开时无任何组件获得焦点。请问使用此类弹窗是否可以实现该需求?

弹窗的XAML代码:

<telerikPrimitives:RadPopup.Popup> 
    <telerikPrimitives:RadPopup Placement="Center" IsModal="False" OutsideBackgroundColor="#6F000000" IsOpen="{Binding WantSendEmail}"> 
        <telerikPrimitives:RadBorder CornerRadius="8" BackgroundColor="{StaticResource Key=LightBackgroundColor}"> 
            <Frame HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Padding="0" Margin="0" WidthRequest="250"> 
                <StackLayout Orientation="Vertical" > 
                    <StackLayout BackgroundColor="{StaticResource Key=MainButtonPrimaryColor}" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"> 
                        <Label Text="Envoi par Email" HorizontalOptions="CenterAndExpand" FontSize="{Binding FontSizeXSmall}" Padding="10" TextColor="White" VerticalOptions="CenterAndExpand"/> 
                    </StackLayout> 
                    <StackLayout Orientation="Horizontal" Padding="10,10,10,0" HorizontalOptions="StartAndExpand" VerticalOptions="CenterAndExpand"> 
                        <CheckBox IsChecked="{Binding SaisieLibre, Converter={StaticResource cnvInverseBoolConverter}}" Color="{StaticResource Key=MainButtonPrimaryColor}"/> 
                        <ContentView Focused="ContentView_Focused" Content="{Binding EntrySearchTiers}" Padding="10,10,10,0" IsEnabled="{Binding SaisieLibre, Converter={StaticResource cnvInverseBoolConverter}}"/> 
                    </StackLayout> 
                    <StackLayout Orientation="Horizontal" Padding="10,10,10,0" HorizontalOptions="StartAndExpand" VerticalOptions="CenterAndExpand"> 
                        <CheckBox IsChecked="{Binding SaisieLibre}" Color="{StaticResource Key=MainButtonPrimaryColor}"/> 
                        <Label Text="Saisie Libre" VerticalOptions="CenterAndExpand"/> 
                    </StackLayout> 
                    <StackLayout Orientation="Horizontal" Padding="10,10,10,0" HorizontalOptions="StartAndExpand" VerticalOptions="CenterAndExpand" IsEnabled="{Binding CurrentUserHasContact}"> 
                        <CheckBox IsChecked="{Binding CCEnable}" Color="{StaticResource Key=MainButtonPrimaryColor}"/> 
                        <Label Text="Recevoir une copie" VerticalOptions="CenterAndExpand"/> 
                    </StackLayout> 
                    <StackLayout Padding="10,0,10,10"> 
                        <Button Style="{StaticResource Key=BtnFlex}" Text="Envoyer" WidthRequest="100" HeightRequest="30" Command="{Binding SendMailCommand}"/> 
                    </StackLayout> 
                </StackLayout> 
            </Frame> 
        </telerikPrimitives:RadBorder> 
    </telerikPrimitives:RadPopup> 
</telerikPrimitives:RadPopup.Popup>

ContentView相关C#代码:

EntrySearchTiers = new SearchableEntry() { Style = (Xamarin.Forms.Style)Application.Current.Resources["MainEntryStyle"], FontSize = FontSizeMedium, Placeholder = "Liste des tiers" };
EntrySearchTiers.Behaviors.Add(new Prism.Behaviors.EventToCommandBehavior {
    //EventName = "Completed", --> Jamais triggered
    EventName = "TextChanged",
    Command = TiersSelectedCommand
});
EntrySearchTiers.SetBinding(Entry.TextProperty, new Binding("CodeTiersSelected", BindingMode.TwoWay, null));
Base.Views.Popups.ChoicesPopup popup = new Base.Views.Popups.ChoicesPopup(_serviceTiers, null, Guid.Empty, EntrySearchTiers, "code tiers :", this, serviceHistoChoice: _serviceHistoChoice, groupChoice: Enums.enumGroupChoice.Tiers);
await popup.ActivateSearchEntryBehavior();

解决方案:可以实现,以下几种方法供你参考

当然可以实现!Telerik RadPopup本身支持通过事件或焦点管理来控制弹窗打开后的焦点状态,这里有几个靠谱的方案:

方案1:利用RadPopup的Opened事件强制取消焦点

这是最直接的方法,在弹窗完全打开后,主动让Entry失去焦点,或者将焦点转移到一个不会触发输入的容器控件上。

步骤:

  1. 给RadPopup添加Opened事件绑定:
<telerikPrimitives:RadPopup Placement="Center" IsModal="False" OutsideBackgroundColor="#6F000000" IsOpen="{Binding WantSendEmail}" Opened="RadPopup_Opened">
  1. 在代码后台实现事件逻辑:
private void RadPopup_Opened(object sender, EventArgs e)
{
    // 先尝试直接让Entry失去焦点
    if (BindingContext is YourViewModel viewModel)
    {
        // 用主线程延迟执行,确保弹窗渲染完成
        Device.BeginInvokeOnMainThread(() => {
            viewModel.EntrySearchTiers?.Unfocus();
        });
    }

    // 如果上面的方法不生效,可尝试将焦点设置到弹窗的根StackLayout(需要给根布局命名)
    // RootStackLayout.Focus();
}

方案2:初始化Entry时禁用自动焦点

如果你不需要Entry在任何场景下自动获取焦点,可以在初始化时设置IsTabStop为false,这样它就不会被自动分配焦点。后续需要用户聚焦时再动态开启。

修改你的C#初始化代码:

EntrySearchTiers = new SearchableEntry() { 
    Style = (Xamarin.Forms.Style)Application.Current.Resources["MainEntryStyle"], 
    FontSize = FontSizeMedium, 
    Placeholder = "Liste des tiers",
    IsTabStop = false // 禁用自动焦点获取
};

当需要让用户能聚焦到Entry时(比如勾选对应的CheckBox后),再动态修改:

// 示例:当SaisieLibre为false时允许Entry获取焦点
EntrySearchTiers.IsTabStop = !SaisieLibre;

方案3:添加不可见的焦点占位控件

在弹窗的根布局最顶部添加一个不可见的Entry,设置它为第一个可获得焦点的控件,这样弹窗打开时会自动聚焦到这个用户感知不到的控件上,间接实现“无组件获得焦点”的效果。

示例XAML修改:

<StackLayout Orientation="Vertical" >
    <!-- 不可见的焦点占位控件 -->
    <Entry IsVisible="false" IsTabStop="true" />
    <!-- 原有的标题栏 -->
    <StackLayout BackgroundColor="{StaticResource Key=MainButtonPrimaryColor}" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <Label Text="Envoi par Email" HorizontalOptions="CenterAndExpand" FontSize="{Binding FontSizeXSmall}" Padding="10" TextColor="White" VerticalOptions="CenterAndExpand"/>
    </StackLayout>
    <!-- 其他原有控件 -->
</StackLayout>

这个方法纯XAML就能解决问题,不需要修改后台逻辑,适合快速适配场景。


总结

优先尝试方案1或方案2,这两个方法简单直接,适配性最好。根据你的代码结构,方案1的Opened事件配合延迟Unfocus()应该就能解决问题。

内容的提问来源于stack exchange,提问作者Alexandre S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:27:57