Xamarin.Forms:在UWP中设置TextBox的边框颜色

时间:2016-10-05 15:14:31

标签: xamarin textbox xamarin.forms uwp windows-10-universal

我想更改TextBox的边框颜色,以便在Xamarin.Forms中使用它。这是通过自定义渲染器完成的。

首先尝试:

自定义渲染器:

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
    base.OnElementChanged(e);

    var control = this.Control as TextBox;
    if (control != null)
    {
        control.BorderBrush = new SolidColorBrush(Windows.UI.ColorHelper.FromArgb(0, 8, 38, 85));
    }
}

结果:点击进入TextBox

后,边框颜色消失了,它变为我的颜色

第二次尝试:

自定义渲染器(来自EntryRenderer的子类):

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
    if(this.Control == null)
    {
        var control = new ColoredTextBox();
        SetNativeControl(control);
    }

    base.OnElementChanged(e);
}

自定义控制:

public class ColoredTextBox : FormsTextBox
{
    protected override void OnGotFocus(RoutedEventArgs e)
    {
        base.OnGotFocus(e);

        var control = e.OriginalSource as TextBox;
        control.BorderBrush = new SolidColorBrush(Windows.UI.ColorHelper.FromArgb(0, 88, 128, 85));
    }

    protected override void OnLostFocus(RoutedEventArgs e)
    {
        base.OnLostFocus(e);

        var control = e.OriginalSource as TextBox;
        control.BorderBrush = new SolidColorBrush(Windows.UI.ColorHelper.FromArgb(0, 88, 128, 85));
    }
}

结果:应用程序崩溃

  

异常:对象引用未设置为对象的实例    StackTrace(最后一行):在Xamarin.Forms.Platform.UWP.VisualElementRenderer`2.SetNativeControl(TNativeElement control)

第三次尝试:

自定义渲染器已更改为ViewRenderer

public class CustomEntryRenderer : ViewRenderer<CustomEntry, ColoredTextBox>
{
    protected override void OnElementChanged(ElementChangedEventArgs<CustomEntry> e)
    {
        var view = Element as CustomEntry;

        if (e.OldElement != null || view == null)
            return;

        var textBox = new ColoredTextBox();
        SetNativeControl(textBox);

        base.OnElementChanged(e);
    }
}

结果:在我点击TextBox后,边框颜色消失了,它变成了我的颜色。此外,我在XAML中设置的文本未设置在新控件上(但这并不奇怪)。现在调用OnGotFocus()OnLostFocus()事件,但是在它们没有带来预期效果之前写入。有趣的是,如果我设置断点并且它不会停止呼叫,则会一直调用这些事件。

如何以编程方式更改UWP中TextBox的边框颜色?

修改

关于副本:链接的问题通常以强调颜色为目标,但是以TextBox为例。主要是我的目标是以编程方式而不是风格/主题。由于目前似乎没有其他办法,解决方案几乎相同。因此,我将其留给社区确定是否重复。

2 个答案:

答案 0 :(得分:1)

UWP project App.Xaml中添加以下代码:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Light">
                <SolidColorBrush x:Key="SystemControlHighlightAccentBrush" Color="#YourHexColourHere" />
            </ResourceDictionary>
        </ResourceDictionary.ThemeDictionaries>
    </ResourceDictionary>
</Application.Resources>

这将覆盖由Xamarin.Forms设置的样式here

答案 1 :(得分:0)

喜欢这个

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if(Control != null)
        {
            if(Resources.ThemeDictionaries.ContainsKey("SystemControlHighlightAccentBrush"))
            {
                var borderBrush = Resources.ThemeDictionaries["SystemControlHighlightAccentBrush"] as SolidColorBrush;
                borderBrush.Color = ###desired color!
            };

        }
    }