using System.ComponentModel; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; namespace Xamarin.Forms.Platform.WinRT { public class SearchBarRenderer : ViewRenderer { Brush _defaultPlaceholderColorBrush; Brush _defaultTextColorBrush; bool _fontApplied; FormsTextBox _queryTextBox; protected override void OnElementChanged(ElementChangedEventArgs e) { if (e.NewElement != null) { if (Control == null) { SetNativeControl(new FormsSearchBox()); Control.QuerySubmitted += OnQuerySubmitted; Control.QueryChanged += OnQueryChanged; Control.Loaded += (sender, args) => { _queryTextBox = Control.GetFirstDescendant(); UpdateTextColor(); UpdatePlaceholderColor(); }; } UpdateText(); UpdatePlaceholder(); UpdateFont(); UpdateAlignment(); UpdatePlaceholderColor(); UpdateTextColor(); } base.OnElementChanged(e); } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); if (e.PropertyName == SearchBar.TextProperty.PropertyName) UpdateText(); else if (e.PropertyName == SearchBar.PlaceholderProperty.PropertyName) UpdatePlaceholder(); else if (e.PropertyName == SearchBar.FontAttributesProperty.PropertyName) UpdateFont(); else if (e.PropertyName == SearchBar.FontFamilyProperty.PropertyName) UpdateFont(); else if (e.PropertyName == SearchBar.FontSizeProperty.PropertyName) UpdateFont(); else if (e.PropertyName == SearchBar.HorizontalTextAlignmentProperty.PropertyName) UpdateAlignment(); else if (e.PropertyName == SearchBar.PlaceholderColorProperty.PropertyName) UpdatePlaceholderColor(); else if (e.PropertyName == SearchBar.TextColorProperty.PropertyName) UpdateTextColor(); } void OnQuerySubmitted(SearchBox sender, SearchBoxQuerySubmittedEventArgs e) { ((ISearchBarController)Element).OnSearchButtonPressed(); } void UpdatePlaceholder() { Control.PlaceholderText = Element.Placeholder ?? string.Empty; } void UpdateFont() { if (Control == null) return; var searchBar = Element; if (searchBar == null) return; var searchBarIsDefault = searchBar.FontFamily == null && searchBar.FontSize == Device.GetNamedSize(NamedSize.Default, typeof (SearchBar), true) && searchBar.FontAttributes == FontAttributes.None; if (searchBarIsDefault && !_fontApplied) return; if (searchBarIsDefault) { Control.ClearValue(Windows.UI.Xaml.Controls.Control.FontStyleProperty); Control.ClearValue(Windows.UI.Xaml.Controls.Control.FontSizeProperty); Control.ClearValue(Windows.UI.Xaml.Controls.Control.FontFamilyProperty); Control.ClearValue(Windows.UI.Xaml.Controls.Control.FontWeightProperty); Control.ClearValue(Windows.UI.Xaml.Controls.Control.FontStretchProperty); } else Control.ApplyFont(searchBar); _fontApplied = true; } void OnQueryChanged(SearchBox sender, SearchBoxQueryChangedEventArgs e) { ((IElementController)Element).SetValueFromRenderer(SearchBar.TextProperty, e.QueryText); } void UpdateText() { Control.QueryText = Element.Text ?? string.Empty; } void UpdateAlignment() { Control.HorizontalTextAlignment = Element.HorizontalTextAlignment.ToNativeTextAlignment(); } void UpdateTextColor() { if (_queryTextBox == null) return; var textColor = Element.TextColor; if (textColor.IsDefault) { if (_defaultTextColorBrush == null) return; _queryTextBox.Foreground = _defaultTextColorBrush; } if (_defaultTextColorBrush == null) _defaultTextColorBrush = _queryTextBox.Foreground; _queryTextBox.Foreground = textColor.ToBrush(); } void UpdatePlaceholderColor() { if (_queryTextBox == null) return; var placeholderColor = Element.PlaceholderColor; if (placeholderColor.IsDefault) { if (_defaultPlaceholderColorBrush == null) return; _queryTextBox.PlaceholderForegroundBrush = _defaultPlaceholderColorBrush; } if (_defaultPlaceholderColorBrush == null) _defaultPlaceholderColorBrush = _queryTextBox.PlaceholderForegroundBrush; _queryTextBox.PlaceholderForegroundBrush = placeholderColor.ToBrush(); } } }