2010-02-19 4 views
2

저는 두 개의 테두리 인 그라디언트 배경 인 간단한 텍스트 상자 템플릿을 작업하고 있습니다. 지금, 내 특정 문제는 내가 원하는 색상으로 textBox의 전경색을 설정하고 올바르게 작동하도록하고 싶습니다. 그러나 장애인 전경 및 전경색이 함께 작동하도록 할 수는 없습니다. 예를 들어 foreground를 빨간색으로 설정하면 textBox를 비활성화하면 전경이 비활성화 된 색상으로 변경되지 않습니다. IsEnabled = "true"트리거에서 전경 바인딩을 시도했지만 작동하지 않는 것 같습니다. 텍스트 상자가 활성화되었는지 여부에 관계없이 전경은 항상 빨간색으로 유지됩니다.내 TextBox 컨트롤 템플릿에 문제가 있습니다.

아래 템플릿을보고 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까? 또한 필자가 템플릿을 만들 때 새로운 점을 알았 기 때문에 다른 실수를 저에게 지적하십시오.

고마워요.

<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" /> 
    <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" /> 
    <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#FFF" /> 
    <SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" /> 


<Style x:Key="TextBoxControlTemplate1" TargetType="{x:Type TextBox}"> 
    <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/> 
    <Setter Property="AllowDrop" Value="true"/> 
    <Setter Property="Background" Value="#00000000"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="FontFamily" Value="Segoe UI"/> 
    <Setter Property="FontSize" Value="12"/> 
    <Setter Property="Padding" Value="8,5,3,3"/> 
    <Setter Property="BorderThickness" Value="0"/> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type TextBox}"> 
     <Grid> 
      <Border BorderBrush="#FF000000" BorderThickness="2,2,2,2" CornerRadius="5,5,5,5" Padding="0,0,0,0" Width="Auto" Height="Auto" Background="#FF000000"/> 
      <Border x:Name="Border" BorderBrush="#FFFFFFFF" BorderThickness="1,1,1,1" CornerRadius="5,5,5,5" Padding="0,0,0,0" Width="Auto" Height="Auto" Margin="2,2,2,2"> 
      <Border.Background> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FF000000" Offset="0"/> 
       <GradientStop Color="#FF4D4D4D" Offset="1"/> 
       </LinearGradientBrush> 
      </Border.Background> 
      </Border> 
      <ScrollViewer Margin="0" x:Name="PART_ContentHost"/> 
     </Grid> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Background" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Border"/> 
      <Setter Property="BorderBrush" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Border"/> 
      <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/> 
      </Trigger> 
      <Trigger Property="IsEnabled" Value="True"> 
      <Setter Property="Foreground" Value="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 


<TextBox Text="TEST" TextWrapping="Wrap" Canvas.Top="293.761" Canvas.Left="112" Style="{DynamicResource TextBoxControlTemplate1}" Height="28.724" Width="232.25" IsTabStop="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" IsEnabled="True" Foreground="#FFFF0000"/> 

답변

3

여기에는 몇 가지 다른 문제가 있습니다. 첫 번째는 컨트롤 인스턴스의 특정 전경 값을 설정하는 것이며 컨트롤의 속성은 의 Trigger에서 설정된 값보다 우선 순위가 높습니다. 이것은 "Border"와 같이 ControlTemplate 안에 설정된 속성과 다릅니다. Border 속성을 설정하기 위해 Trigger을 사용하는 방법이 그 예입니다. 일반적으로 TemplateBinding을 사용하여 제어 인스턴스에 설정된 값 (기본값 : Background)을 현재 무시하고 있습니다.당신이 Foreground 함께하고 싶은처럼

당신은 기본 및 대체 값을 제공하기 위해 StyleSetterTrigger을 사용할 수 있습니다, 당신의 스타일 컨트롤 속성의 두 값 사이를 전환합니다. 이것은 여전히 ​​인스턴스에 설정된 값으로 대체 될 수 있습니다. Trigger을 재정의하는 인스턴스를 허용하지 않으려면 ControlTemplate 내부 요소의 값을 설정하는 "테두리" Trigger처럼 설정하십시오.

마지막 변경 사항은 Style에 넣는 브러쉬의 StaticResource로 전환하는 것입니다. 이 경우에는 차이가 나지 않지만 어떤 경우에는 기본 스타일이 선언 된 파일에서 주변 리소스에 대한 참조가없는 컨텍스트로 끌어 올 수 있습니다. 정적을 사용하면 어디에서 사용 되든 리소스를 포함합니다. 이 기능을 사용할 수는 없지만 스타일/템플릿을 설정할 때는 좋은 습관이 필요합니다.

<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" /> 
<SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" /> 

<Style x:Key="TextBoxControlTemplate1" TargetType="{x:Type TextBox}"> 
    <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/> 
    <Setter Property="AllowDrop" Value="true"/> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FF000000" Offset="0"/> 
       <GradientStop Color="#FF4D4D4D" Offset="1"/> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="FontFamily" Value="Segoe UI"/> 
    <Setter Property="FontSize" Value="12"/> 
    <Setter Property="Padding" Value="8,5,3,3"/> 
    <Setter Property="BorderThickness" Value="2"/> 
    <Setter Property="BorderBrush" Value="#FF000000"/> 
    <Setter Property="Foreground" Value="Red" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBox}"> 
       <Grid> 
        <!--Take advantage of containment when possible to let the layout engine help you!--> 
        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="5" Padding="0" Background="#FF000000"/> 
        <Border x:Name="Border" BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="5" Padding="0" Margin="{TemplateBinding BorderThickness}" 
          Background="{TemplateBinding Background}"/> 
        <ScrollViewer Margin="0" x:Name="PART_ContentHost"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter Property="Background" Value="{StaticResource DisabledBackgroundBrush}" TargetName="Border"/> 
         <Setter Property="BorderBrush" Value="{StaticResource DisabledBackgroundBrush}" TargetName="Border"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

그리고 TextBoxStyle 설정을 사용하여 : :

<TextBox Text="TEST" TextWrapping="Wrap" Canvas.Top="293.761" Canvas.Left="112" Style="{DynamicResource TextBoxControlTemplate1}" 
     Height="28.724" Width="232.25" IsTabStop="False" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" /> 

는 여기 개선과 코드의

1

몇 가지 아이디어를 시도 :

  1. 은 트리거 중 하나를 제거하십시오. 두 개의 반대되는 트리거를 갖는 것이 좋은 생각이 아닐 수도 있습니다. Border 선언에 기본값 Background, BorderBrushForeground을 직접 설정하고 Enabled="True" 트리거를 제거하십시오. 그런 다음 디버깅은 Enabled="False" 트리거를 올바르게 가져 오는 문제입니다.

  2. Enabled="False" 트리거의 세터에 TargetName 속성을 추가하십시오.

  3. 이것은 길지만, IsEnabled 대신 UIElement.IsEnabled을 사용하십시오 (예 : <Trigger Property="UIElement.IsEnabled">).

희망이 여기에 도움이된다고합니다.

1

가능한 이유는 사용자가 자신의 스타일을 사용하는 시점에 DisabledBackgroundBrush이 표시되지 않는다는 것입니다. ControlTemplate의 자원에 스타일을 추가 해보세요 : 그런데

<ControlTemplate TargetType="{x:Type TextBox}"> 
    <ControlTemplate.Resources> 
     <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" /> 
     ... 
    </ControlTemplate.Resources> 
    ... 

, 당신의 컨트롤 템플릿이 속성 값을 준수하지 않습니다. 예를 들어, 당신은 아마 당신의 컨트롤 템플릿에

<ScrollViewer Margin="{TemplateBinding Padding}" x:Name="PART_ContentHost"/> 

같은 것을 사용해야합니다.

관련 문제