【问题标题】:Placing a SearchBar in the top/navigation bar在顶部/导航栏中放置一个 SearchBar
【发布时间】:2016-09-07 00:44:57
【问题描述】:

在 Forms 项目中,是否可以放置一个 SearchBar 以使其显示在应用程序的顶部/导航栏中?我想要实现的是类似于 Android Youtube 应用程序的东西,只是跨平台:

【问题讨论】:

  • 你有没有得到解决方案。我需要在 xamarin 表单中相同
  • @SANDEEP 不幸的是,我早就停止使用 Xamarin,所以我不确定目前的做法是什么。您尝试过任何答案吗?

标签: xamarin xamarin.forms


【解决方案1】:

为此,您应该为您的页面编写一个渲染器

我的 iOS 实现(带有自定义“searchField”)

using CoreGraphics;
using Foundation;
using MyControls;
using MyRenderer;
using UIKit;
using Xamarin.Forms;

[assembly: ExportRenderer(typeof(MySearchContentPage), typeof(MySearchContentPageRenderer))]

namespace IOS.Renderer
{
    using Xamarin.Forms.Platform.iOS;

    public class MySearchContentPageRenderer : PageRenderer
    {
        public override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);

            SetSearchToolbar();
        }

        public override void WillMoveToParentViewController(UIKit.UIViewController parent)
        {
            base.WillMoveToParentViewController(parent);

            if (parent != null)
            {
                parent.NavigationItem.RightBarButtonItem = NavigationItem.RightBarButtonItem;
                parent.NavigationItem.TitleView = NavigationItem.TitleView;
            }
        }

        private void SetSearchToolbar()
        {
            var element = Element as MySearchContentPage;
            if (element == null)
            {
                return;
            }

            var width = NavigationController.NavigationBar.Frame.Width;
            var height = NavigationController.NavigationBar.Frame.Height;
            var searchBar = new UIStackView(new CGRect(0, 0, width * 0.85, height));

            searchBar.Alignment = UIStackViewAlignment.Center;
            searchBar.Axis = UILayoutConstraintAxis.Horizontal;
            searchBar.Spacing = 3;

            var searchTextField = new MyUITextField();
            searchTextField.BackgroundColor = UIColor.FromRGB(239, 239, 239);
            NSAttributedString strAttr = new NSAttributedString("Search", foregroundColor: UIColor.FromRGB(146, 146, 146));
            searchTextField.AttributedPlaceholder = strAttr;
            searchTextField.SizeToFit();

            // Delete button
            UIButton textDeleteButton = new UIButton(new CGRect(0, 0, searchTextField.Frame.Size.Height + 5, searchTextField.Frame.Height));
            textDeleteButton.Font = UIFont.FromName("FontAwesome", 18f);
            textDeleteButton.BackgroundColor = UIColor.Clear;
            textDeleteButton.SetTitleColor(UIColor.FromRGB(146, 146, 146), UIControlState.Normal);
            textDeleteButton.SetTitle("\uf057", UIControlState.Normal);
            textDeleteButton.TouchUpInside += (sender, e) => 
            {
                searchTextField.Text = string.Empty;
            };

            searchTextField.RightView = textDeleteButton;
            searchTextField.RightViewMode = UITextFieldViewMode.Always;

            // Border
            searchTextField.BorderStyle = UITextBorderStyle.RoundedRect;
            searchTextField.Layer.BorderColor = UIColor.FromRGB(239, 239, 239).CGColor;
            searchTextField.Layer.BorderWidth = 1;
            searchTextField.Layer.CornerRadius = 5;
            searchTextField.EditingChanged += (sender, e) => 
            { 
                element.SetValue(MySearchContentPage.SearchTextProperty, searchTextField.Text);
            };

            searchBar.AddArrangedSubview(searchTextField);

            var searchbarButtonItem = new UIBarButtonItem(searchBar);
            NavigationItem.SetRightBarButtonItem(searchbarButtonItem, true);

            NavigationItem.TitleView = new UIView();

            if (ParentViewController != null)
            {
                ParentViewController.NavigationItem.RightBarButtonItem = NavigationItem.RightBarButtonItem;
                ParentViewController.NavigationItem.TitleView = NavigationItem.TitleView;
            }
        }
    }
}

另外,还有一些讨论:How to include view in NavigationBar of Xamarin Forms?

我希望,你理解了主要思想。

【讨论】:

  • 你好@Vitaliy!我尝试在带有 Prism 的 Xamarin Forms 项目中实现您的解决方案,并且它“几乎”可以工作。我的问题是,当显示搜索页面时,搜索文本字段会消失,并显示左侧的“返回”标题。你有过这样的事情吗?在 ViewWillAppear 事件之后,有一些事件会创建“返回”标题。
  • 没关系。我想通了。这是我正在使用的一个插件,它改变了导航行为(图标化)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多