首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在自定义渲染器中基于IsFocused属性隐藏搜索栏图标

在自定义渲染器中基于IsFocused属性隐藏搜索栏图标
EN

Stack Overflow用户
提问于 2019-10-16 11:50:15
回答 2查看 716关注 0票数 3

我想使用基于SearchBarRenderer属性的自定义IsFocused来隐藏IOS中的搜索栏图标。我怎样才能做到这一点?

代码语言:javascript
运行
复制
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (Element == null || Control == null)
                return;

            var element = Element as CustomSearchBar;

            if (element.IsFocused)
            {

            }
            else
            {

            }
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-17 03:00:23

如果您正在使用自定义渲染器来实现它,请编写如下代码。

代码语言:javascript
运行
复制
[assembly: ExportRenderer(typeof(CustomSearchBar), typeof(CustomSearchBarRenderer))]
namespace App15.iOS
{
    public class CustomSearchBarRenderer : SearchBarRenderer
    {
        UIImage searchImg;
        protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
        {
            base.OnElementChanged(e);
            searchImg = Control.GetImageForSearchBarIcon(UISearchBarIcon.Search, UIControlState.Normal);
            if (e.OldElement != null)
            {
                Control.OnEditingStarted -= Control_OnEditingStarted;
                Control.OnEditingStopped -= Control_OnEditingStopped;
            }

            if (e.NewElement != null)
            {
                if (null != Control)
                {
                    Control.OnEditingStarted += Control_OnEditingStarted;
                    Control.OnEditingStopped += Control_OnEditingStopped;
                }
            }
        }

        private void Control_OnEditingStopped(object sender, EventArgs e)
        {
            var searchBar = sender as UISearchBar;
            searchBar.SetImageforSearchBarIcon(searchImg, UISearchBarIcon.Search, UIControlState.Normal);
        }

        private void Control_OnEditingStarted(object sender, EventArgs e)
        {
            var searchBar = sender as UISearchBar;
            searchBar.SetImageforSearchBarIcon(new UIImage(), UISearchBarIcon.Search, UIControlState.Normal);
        }
    }
}

注意: App15是本地项目中的命名空间。

正如document 效果导论 of Effect所说的那样,您也可以参考这个文档产生效果来实现它,因为它不需要使用自定义渲染器来实现它。

效果样本如下:

创建SearchBarEffects

代码语言:javascript
运行
复制
public class SearchBarEffects : RoutingEffect
{
    public SearchBarEffects() : base($"MyCompany.{nameof(SearchBarEffects)}")
    {

    }
}

Xaml中使用:

代码语言:javascript
运行
复制
// here is custom renderer
<local:CustomSearchBar Placeholder="renderer input"/> 
// here is custom effect
<SearchBar Placeholder="effect input">
    <SearchBar.Effects>
        <local:SearchBarEffects />
    </SearchBar.Effects>
</SearchBar>

SearchBarEffect解决方案中创建iOS:

代码语言:javascript
运行
复制
[assembly: ResolutionGroupName("MyCompany")]
[assembly: ExportEffect(typeof(App15.iOS.SearchBarEffect), "SearchBarEffects")]
namespace App15.iOS
{
    public class SearchBarEffect : PlatformEffect
    {
        UIImage searchImg;
        protected override void OnAttached()
        {
            searchImg = ((UISearchBar)Control).GetImageForSearchBarIcon(UISearchBarIcon.Search, UIControlState.Normal);
            ((UISearchBar)Control).OnEditingStarted += SearchBar_OnEditingStarted;
            ((UISearchBar)Control).OnEditingStopped += SearchBar_OnEditingStopped;
        }

        private void SearchBar_OnEditingStopped(object sender, EventArgs e)
        {
            var searchBar = sender as UISearchBar;
            searchBar.SetImageforSearchBarIcon(searchImg, UISearchBarIcon.Search, UIControlState.Normal);
        }

        private void SearchBar_OnEditingStarted(object sender, EventArgs e)
        {
            var searchBar = sender as UISearchBar;
            searchBar.SetImageforSearchBarIcon(new UIImage(), UISearchBarIcon.Search, UIControlState.Normal);
        }

        protected override void OnDetached()
        {
            ((UISearchBar)Control).OnEditingStarted -= SearchBar_OnEditingStarted;
            ((UISearchBar)Control).OnEditingStopped -= SearchBar_OnEditingStopped;
        }
    }
}

最后,以两种方式展示效果。上是效果的,下是伦德尔的。

票数 1
EN

Stack Overflow用户

发布于 2019-10-16 11:59:44

个人注意-没有必要使用自定义渲染器,一个效果是远远超过-我测试的效果,而不是自定义渲染器。关于如何创建效果,请参见这里

如果只将此效果添加到<SearchBar> 元素.中,则this.Control将成为UISearchBar

因此您可以这样做(基于iOSXamarin.iOS文档):

效果的iOS实现:

代码语言:javascript
运行
复制
public class NoSearchIconEffect : PlatformEffect
{
    UIImage defaultIcon = null;

    protected override void OnAttached()
    {
        var searchBar = this.Control as UISearchBar;
        defaultIcon = defaultIcon ?? searchBar.GetImageForSearchBarIcon(UISearchBarIcon.Search, UIControlState.Normal); //This will save the default icon

        searchBar.OnEditingStarted += delegate
        {
            searchBar.SetImageforSearchBarIcon(new UIImage(), UISearchBarIcon.Search, UIControlState.Normal);
        };

        searchBar.OnEditingStopped += delegate
        {
            searchBar.SetImageforSearchBarIcon(defaultIcon, UISearchBarIcon.Search, UIControlState.Normal);
        };
    }

    protected override void OnDetached()
    {

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58412605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档