0

在我的Xamarin表單應用程序中,我需要更改Entry控件的背景顏色。我添加了自定義渲染器,但默認白色在Windows應用程序中具有焦點時不會更改。它在ios和android中工作正常。這是我的Windows自定義渲染器。Xamarin Windows條目背景顏色

public class MyCustomEntryRenderer : EntryRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
    { 
     if (Control != null) 
     { 
      Control.Foreground = new SolidColorBrush(Colors.Transparent); 
      Control.Background = new SolidColorBrush(Colors.Transparent); 
     } 
     base.OnElementChanged(e); 
    } 

    protected override void OnElementPropertyChanged(object sender, 
              System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (Control != null) 
     { 
      Control.Foreground = new SolidColorBrush(Colors.Transparent); 
      Control.Background = new SolidColorBrush(Colors.Transparent); 
     } 
     base.OnElementPropertyChanged(sender, e); 
    } 
} 
+0

哪個Xamarin.Forms的版本,您使用的重點? –

回答

1

您需要覆蓋默認的TextBox樣式。 Here is the default style 您可以添加樣式的App.xaml裏面是這樣的:

<Application.Resources> 
     <ResourceDictionary>     
      <SolidColorBrush x:Key="RedBrush" Color="Red"></SolidColorBrush> 
      <!-- Default style for Windows.UI.Xaml.Controls.TextBox --> 
      <Style x:Key="CustomTextBoxStyle" TargetType="TextBox" > 
       <Setter Property="MinWidth" Value="{ThemeResource TextControlThemeMinWidth}" /> 
       <Setter Property="MinHeight" Value="{ThemeResource TextControlThemeMinHeight}" /> 
       <Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}" /> 
       <Setter Property="Background" Value="{ThemeResource SystemControlBackgroundAltHighBrush}" /> 
       <Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundChromeDisabledLowBrush}" /> 
       <Setter Property="SelectionHighlightColor" Value="{ThemeResource SystemControlHighlightAccentBrush}" /> 
       <Setter Property="BorderThickness" Value="{ThemeResource TextControlBorderThemeThickness}" /> 
       <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" /> 
       <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" /> 
       <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Auto" /> 
       <Setter Property="ScrollViewer.VerticalScrollMode" Value="Auto" /> 
       <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Hidden" /> 
       <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Hidden" /> 
       <Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="False" /> 
       <Setter Property="Padding" Value="{ThemeResource TextControlThemePadding}"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="TextBox"> 
          <Grid> 
           <Grid.Resources> 
            <Style x:Name="DeleteButtonStyle" TargetType="Button"> 
             <Setter Property="Template"> 
              <Setter.Value> 
               <ControlTemplate TargetType="Button"> 
                <Grid x:Name="ButtonLayoutGrid" BorderBrush="{ThemeResource TextBoxButtonBorderThemeBrush}" 
                BorderThickness="{TemplateBinding BorderThickness}" 
                Background="{ThemeResource TextBoxButtonBackgroundThemeBrush}"> 
                 <VisualStateManager.VisualStateGroups> 
                  <VisualStateGroup x:Name="CommonStates"> 
                   <VisualState x:Name="Normal" /> 
                   <VisualState x:Name="PointerOver"> 
                    <Storyboard> 
                     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GlyphElement" 
                  Storyboard.TargetProperty="Foreground"> 
                      <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAccentBrush}" /> 
                     </ObjectAnimationUsingKeyFrames> 
                    </Storyboard> 
                   </VisualState> 
                   <VisualState x:Name="Pressed"> 
                    <Storyboard> 
                     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonLayoutGrid" 
                  Storyboard.TargetProperty="Background"> 
                      <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAccentBrush}" /> 
                     </ObjectAnimationUsingKeyFrames> 
                     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="GlyphElement" 
                  Storyboard.TargetProperty="Foreground"> 
                      <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource RedBrush}" /> 
                     </ObjectAnimationUsingKeyFrames> 
                    </Storyboard> 
                   </VisualState> 
                   <VisualState x:Name="Disabled"> 
                    <Storyboard> 
                     <DoubleAnimation Storyboard.TargetName="ButtonLayoutGrid" 
              Storyboard.TargetProperty="Opacity" 
              To="0" 
              Duration="0" /> 
                    </Storyboard> 
                   </VisualState> 
                  </VisualStateGroup> 
                 </VisualStateManager.VisualStateGroups> 
                 <TextBlock x:Name="GlyphElement" 
           Foreground="{ThemeResource SystemControlForegroundChromeBlackMediumBrush}" 
           VerticalAlignment="Center" 
           HorizontalAlignment="Center" 
           FontStyle="Normal" 
           FontSize="12" 
           Text="&#xE10A;" 
           FontFamily="{ThemeResource SymbolThemeFontFamily}" 
           AutomationProperties.AccessibilityView="Raw"/> 
                </Grid> 
               </ControlTemplate> 
              </Setter.Value> 
             </Setter> 
            </Style> 
           </Grid.Resources> 
           <VisualStateManager.VisualStateGroups> 
            <VisualStateGroup x:Name="CommonStates"> 
             <VisualState x:Name="Disabled"> 
              <Storyboard> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HeaderContentPresenter" 
               Storyboard.TargetProperty="Foreground"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseMediumLowBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" 
               Storyboard.TargetProperty="Background"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledTransparentBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement" 
               Storyboard.TargetProperty="Background"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement" 
               Storyboard.TargetProperty="BorderBrush"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentElement" 
               Storyboard.TargetProperty="Foreground"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledChromeDisabledLowBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PlaceholderTextContentPresenter" 
               Storyboard.TargetProperty="Foreground"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledChromeDisabledLowBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
              </Storyboard> 
             </VisualState> 
             <VisualState x:Name="Normal" /> 
             <VisualState x:Name="PointerOver"> 
              <Storyboard> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement" 
               Storyboard.TargetProperty="BorderBrush"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightChromeAltLowBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" 
               Storyboard.TargetProperty="Opacity"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource TextControlBackgroundHoverOpacity}" /> 
               </ObjectAnimationUsingKeyFrames> 
              </Storyboard> 
             </VisualState> 
             <VisualState x:Name="Focused"> 
              <Storyboard> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PlaceholderTextContentPresenter" 
               Storyboard.TargetProperty="Foreground"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlPageTextChromeBlackMediumLowBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <!--<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" 
               Storyboard.TargetProperty="Background"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundChromeWhiteBrush}" /> 
               </ObjectAnimationUsingKeyFrames>--> 

<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" 
Storyboard.TargetProperty="Background"> 
    <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource RedBrush}" /> 
</ObjectAnimationUsingKeyFrames> 



<!--<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" 
Storyboard.TargetProperty="Opacity"> 
    <DiscreteObjectKeyFrame KeyTime="0" Value="0" /> 
</ObjectAnimationUsingKeyFrames>--> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement" 
               Storyboard.TargetProperty="BorderBrush"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAccentBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentElement" 
               Storyboard.TargetProperty="Foreground"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlForegroundChromeBlackHighBrush}" /> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentElement" 
               Storyboard.TargetProperty="RequestedTheme"> 
                <DiscreteObjectKeyFrame KeyTime="0" Value="Light" /> 
               </ObjectAnimationUsingKeyFrames> 
              </Storyboard> 
             </VisualState> 
            </VisualStateGroup> 
            <VisualStateGroup x:Name="ButtonStates"> 
             <VisualState x:Name="ButtonVisible"> 
              <Storyboard> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DeleteButton" 
               Storyboard.TargetProperty="Visibility"> 
                <DiscreteObjectKeyFrame KeyTime="0"> 
                 <DiscreteObjectKeyFrame.Value> 
                  <Visibility>Visible</Visibility> 
                 </DiscreteObjectKeyFrame.Value> 
                </DiscreteObjectKeyFrame> 
               </ObjectAnimationUsingKeyFrames> 
              </Storyboard> 
             </VisualState> 
             <VisualState x:Name="ButtonCollapsed" /> 
            </VisualStateGroup> 
           </VisualStateManager.VisualStateGroups> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="Auto" /> 
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="Auto" /> 
            <RowDefinition Height="*" /> 
           </Grid.RowDefinitions> 
           <Border x:Name="BackgroundElement" 
            Grid.Row="1" 
            Background="{TemplateBinding Background}" 
            Margin="{TemplateBinding BorderThickness}" 
            Opacity="{ThemeResource TextControlBackgroundRestOpacity}" 
            Grid.ColumnSpan="2" 
            Grid.RowSpan="1"/> 
           <Border x:Name="BorderElement" 
            Grid.Row="1" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Grid.ColumnSpan="2" 
            Grid.RowSpan="1"/> 
           <ContentPresenter x:Name="HeaderContentPresenter" 
            x:DeferLoadStrategy="Lazy" 
            Visibility="Collapsed" 
            Grid.Row="0" 
            Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}" 
            Margin="0,0,0,8" 
            Grid.ColumnSpan="2" 
            Content="{TemplateBinding Header}" 
            ContentTemplate="{TemplateBinding HeaderTemplate}" 
            FontWeight="Normal" /> 
           <ScrollViewer x:Name="ContentElement" 
            Grid.Row="1" 
            HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" 
            HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" 
            VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" 
            VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" 
            IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" 
            IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" 
            IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}" 
            Margin="{TemplateBinding BorderThickness}" 
            Padding="{TemplateBinding Padding}" 
            IsTabStop="False" 
            AutomationProperties.AccessibilityView="Raw" 
            ZoomMode="Disabled" /> 
           <ContentControl x:Name="PlaceholderTextContentPresenter" 
            Grid.Row="1" 
            Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}" 
            Margin="{TemplateBinding BorderThickness}" 
            Padding="{TemplateBinding Padding}" 
            IsTabStop="False" 
            Grid.ColumnSpan="2" 
            Content="{TemplateBinding PlaceholderText}" 
            IsHitTestVisible="False"/> 
           <Button x:Name="DeleteButton" 
            Grid.Row="1" 
            Style="{StaticResource DeleteButtonStyle}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Margin="{ThemeResource HelperButtonThemePadding}" 
            IsTabStop="False" 
            Grid.Column="1" 
            Visibility="Collapsed" 
            FontSize="{TemplateBinding FontSize}" 
            MinWidth="34" 
            VerticalAlignment="Stretch"/> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ResourceDictionary> 
    </Application.Resources> 

現在,您可以在此改變 「聚焦」 的VisualState:

<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" 
Storyboard.TargetProperty="Background"> 
    <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource RedBrush}" /> 
</ObjectAnimationUsingKeyFrames> 

兼評,刪除或覆蓋「透明度「

<!--<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement" 
Storyboard.TargetProperty="Opacity"> 
    <DiscreteObjectKeyFrame KeyTime="0" Value="0" /> 
</ObjectAnimationUsingKeyFrames>--> 

現在在您的渲染器中,您需要加載樣式並添加爲您的文本框:

private TextBox nativeControl; 
private CustomEntry customControl; 
protected override void 
OnElementChanged(ElementChangedEventArgs<CustomEntry> e) 
{ 
    base.OnElementChanged(e); 

    this.customControl = e.NewElement; 
    this.nativeControl = new TextBox(); 

    var style = App.Current.Resources["CustomTextBoxStyle"] as Windows.UI.Xaml.Style; 
    this.nativeControl.Style = style; 
    this.SetNativeControl(nativeControl); 
} 

現在你有背景爲紅色,如果文本框是

+0

它工作。但之後,視圖模型的綁定屬性不起作用。 –

+0

您應該在渲染器內連接自定義控件和本機控件的屬性。處理本地控件的事件和狀態(在渲染器類中)並設置自定義控件。如果本地控件的text屬性被改變(TextChanged事件),則設置自定義控件的text屬性:this.customControl.Text = this.nativeControl.Text; – iwanlenin

+0

它適用於按鈕控件,但對於文本框我有以下錯誤this.SetNativeControl只能處理FormsTextBox類型的對象。 –

0

WindowsPhone是在這一個有點古怪,因爲它會重置在某些情況下的背景顏色。

要解決這個問題,您還需要關注特定於平臺的控件本身的GotFocusLostFocus事件。