2015-09-10 57 views
1

如果TextBox IsReadOnly需要更改我的TextBox的背景顏色。通用Windows平臺中TextBox的樣式

在WPF我有以下樣式:

<Style TargetType="TextBox"> 
    <Setter Property="Background" Value="{StaticResource ControlBackgroundColorBrush}" /> 
    <Setter Property="Foreground" Value="{StaticResource PrimaryColorBrush}" /> 
    <Setter Property="BorderBrush" Value="{StaticResource SecondaryColorBrush}" /> 
    <Setter Property="VerticalContentAlignment" Value="Center" /> 
    <Setter Property="IsReadOnlyCaretVisible" Value="False" /> 
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource DefaultErrorTemplate}" /> 
    <Style.Triggers> 
     <Trigger Property="IsReadOnly" Value="True"> 
      <Setter Property="BorderBrush" Value="{StaticResource ControlBackgroundColorBrush}" /> 
      <Setter Property="IsHitTestVisible" Value="False" /> 
     </Trigger> 
     <Trigger Property="Validation.HasError" Value="True"> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

但UWP是Style.Trigger不可用。我嘗試用VisualState解決這個問題。我得到一個TextBox模板(來自Blend)並操作它,但它不起作用。 這裏我對TextBox風格:

<Style 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.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> 
         <Storyboard x:Name="Storyboard1" /> 
        </Grid.Resources> 
        <Grid.Background> 
         <StaticResource ResourceKey="ControlBackgroundColorBrush" /> 
        </Grid.Background> 
        <Grid.BorderBrush> 
         <StaticResource ResourceKey="ControlBackgroundColorBrush" /> 
        </Grid.BorderBrush> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition Height="*" /> 
        </Grid.RowDefinitions> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 

          <VisualState x:Name="Normal" /> 

          <VisualState x:Name="ReadOnly"> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="PlaceholderTextContentPresenter"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource HighlightColorBrush}" /> 
            </ObjectAnimationUsingKeyFrames> 

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

            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundElement"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource TextControlBackgroundFocusedOpacity}" /> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 

          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="ButtonStates"> 

         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <Border x:Name="BackgroundElement" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" Margin="{TemplateBinding BorderThickness}" Opacity="{ThemeResource TextControlBackgroundRestOpacity}" Grid.Row="1" Grid.RowSpan="1" /> 
        <Border x:Name="BorderElement" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Grid.ColumnSpan="2" Grid.Row="1" Grid.RowSpan="1" /> 
        <ContentPresenter x:Name="HeaderContentPresenter" Grid.ColumnSpan="2" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}" FontWeight="Normal" Margin="0,0,0,8" Grid.Row="0" Visibility="Collapsed" x:DeferLoadStrategy="Lazy" /> 
        <Border x:Name="ContentElement" AutomationProperties.AccessibilityView="Raw" ScrollViewer.HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" ScrollViewer.HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" ScrollViewer.IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" ScrollViewer.IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" ScrollViewer.IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}" Padding="{TemplateBinding Padding}" Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" ScrollViewer.VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" ScrollViewer.ZoomMode="Disabled" /> 
        <ContentControl x:Name="PlaceholderTextContentPresenter" Grid.ColumnSpan="2" Content="{TemplateBinding PlaceholderText}" Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}" IsHitTestVisible="False" IsTabStop="False" Margin="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" Grid.Row="1" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

不知道如何解決這個問題???

+0

真的嗎?沒有人有任何想法? – iwanlenin

+0

我不知道「ReadOnly」是默認連接的,你可能只需要將它添加到[GoToState](https://msdn.microsoft.com/en-us/library/windows/apps/ windows.ui.xaml.visualstatemanager.gotostate.Aspx)控件的方法。 –

回答

0

例如,你可以創建從TextBox繼承自己的自定義TextBox控件和重寫OnApplyTemplate方法檢查IsReadOnly財產,這樣的:

public class CustomTextBox : TextBox 
{ 
    protected override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     if (IsReadOnly) 
     { 
      Background = new SolidColorBrush(Colors.Red); //eg. set Background to Red 
      IsHitTestVisible = false; //Additionally you can set IsHitTestVisible if it should be really readonly 
     } 
    } 
} 

,並在XAML中使用新的控制:

<local:CustomTextBox Width="200" 
         Height="50" 
         IsReadOnly="True" /> 
0

TextBox中沒有內置的「ReadOnly」可視狀態。但是你可以在VisualState中添加自己的VisualStateGroup,然後使用StateTrigger。

<Style TargetType="TextBox"> 
    ... 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TextBox"> 
       <Grid> 
        ... 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Disabled"> 
           ... 
          </VisualState> 
          <VisualState x:Name="Normal" /> 
          <VisualState x:Name="PointerOver"> 
           ... 
          </VisualState> 
          <VisualState x:Name="Focused"> 
           ... 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="ButtonStates"> 
          <VisualState x:Name="ButtonVisible"> 
           ... 
          </VisualState> 
          <VisualState x:Name="ButtonCollapsed" /> 
         </VisualStateGroup> 
         <VisualStateGroup> 
          <VisualState> 
           <VisualState.StateTriggers> 
            <StateTrigger IsActive="{Binding IsReadOnly, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"/> 
           </VisualState.StateTriggers> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="PlaceholderTextContentPresenter"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource HighlightColorBrush}" /> 
            </ObjectAnimationUsingKeyFrames> 

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

            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundElement"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource TextControlBackgroundFocusedOpacity}" /> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        ... 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
相關問題