2015-05-15 4 views
1

Я пытаюсь определить Style, которые могут быть использованы, где Button держит TextBlock как его Content и когда Button имеет IsEnabled = False Я хочу установить TextBlock «s Foregroung цвет.Binding TextBlock цвет кнопки IsEnabled от стиля

<Button Style="{StaticResource TransparentButtonStyle}" 
     IsEnabled="{Binding IsAllowed}"> 
     <TextBlock Text="Click Me" 
       Style="{StaticResource HyperLinkStyle}"> 
     </TextBlock> 
</Button> 

<Style x:Key="TransparentButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Border Background="Transparent"> 
        <ContentPresenter/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="HyperLinkStyle" TargetType="TextBlock"> 
    <Setter Property="Foreground" Value="Blue" /> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Cursor" Value="Hand" /> 
      <Setter Property="Foreground" Value="LightBlue" /> 
      <Setter Property="TextDecorations" Value="Underline" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Могу ли я модифицировать TextBlock «s Style, чтобы захватить родительский Button» IsEnabled значение s каким-то образом, чтобы иметь возможность установить Foreground цвет?

ответ

2

вы можете просто добавьте <Trigger Property="IsEnabled" Value="False"> к вашему HyperLinkStyle, но я рекомендую вам создать LinkButtonStyle вместо этого, так что вы окончательное заполнение разметки будет гораздо чище:

<Button Content="Link text" Style="{StaticResource LinkButtonStyle}" /> 

это только делает ваши взгляды гораздо чище ...

вот мой шаблон LinkButton:

<Style x:Key="LinkButtonStyle" TargetType="Button"> 
    <Setter Property="Foreground" Value="{StaticResource LinkButtonText}" /> 
    <Setter Property="Background" Value="Transparent" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <TextBlock x:Name="ContentPresenter" Background="{TemplateBinding Background}" 
          Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="ContentPresenter" Property="Foreground" Value="{DynamicResource LinkButtonDisabled}" /> 
        </Trigger> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsMouseOver" Value="True" /> 
          <Condition Property="IsEnabled" Value="True" /> 
         </MultiTrigger.Conditions> 
         <Setter TargetName="ContentPresenter" Property="TextDecorations" Value="Underline"/> 
        </MultiTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
2

Если вы хотите, чтобы добраться до Button вы можете использовать DataTrigger с RalativeSource связывания

<Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <!-- Setters --> 
    </Trigger> 
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsEnabled}" Value="False"> 
     <!-- Setters --> 
    </DataTrigger> 
</Style.Triggers> 

, но если вы хотите сделать свой Style независимо от того, что является родителем, то нормальный Trigger на IsEnabled имущество должно работать так же хорошо,

<Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <!-- Setters --> 
    </Trigger> 
    <Trigger Property="IsEnabled" Value="False"> 
     <!-- Setters --> 
    </Trigger> 
</Style.Triggers> 

нормальный Trigger должен работать, потому что IsEnabled значение под влиянием UIElement.IsEnabledCore, который

Получает значение, которое становится возвращаемым значением IsEnabled в производных классов ... Реализация по умолчанию этого свойства кэширует значение, а также вычисляет, включен ли родительский элемент этого элемента. (Если родитель не включен, дочерний элемент не может быть эффективно включен в практическом пользовательском интерфейсе (UI).)

поэтому в основном, если родитель Button отключен ребенок TextBlock будет отключен, а

Смежные вопросы