Wpf 无法从样式中将文本块颜色绑定到按钮

Wpf 无法从样式中将文本块颜色绑定到按钮,wpf,xaml,Wpf,Xaml,我试图定义一种样式,当按钮将文本块作为其内容时,可以使用该样式,当按钮已启用=False时,我想设置文本块的前景颜色 <Button Style="{StaticResource TransparentButtonStyle}" IsEnabled="{Binding IsAllowed}"> <TextBlock Text="Click Me" Style="{StaticResource HyperLinkS

我试图定义一种
样式
,当
按钮
文本块
作为其
内容
时,可以使用该样式,当
按钮
已启用=False时,我想设置
文本块
前景
颜色

<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
样式
来抓取父
按钮
已启用
值,以便能够以某种方式设置
前景
颜色吗?

如果你想进入
按钮
你可以使用
数据触发器
相对资源
绑定

<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>
正常的
触发器
应该可以工作,因为
IsEnabled
值受

获取一个值,该值将成为派生类中IsEnabled的返回值 ... 此属性的默认实现缓存该值,并计算是否启用此元素的父元素。(如果未启用父元素,则无法在实际用户界面(UI)中有效启用子元素。)


因此,基本上,如果禁用了父
按钮
,则子
文本块
也将被禁用

如果您想进入
按钮
,可以使用
数据触发器
关系资源
绑定

<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>
正常的
触发器
应该可以工作,因为
IsEnabled
值受

获取一个值,该值将成为派生类中IsEnabled的返回值 ... 此属性的默认实现缓存该值,并计算是否启用此元素的父元素。(如果未启用父元素,则无法在实际用户界面(UI)中有效启用子元素。)

因此,基本上,如果禁用了父
按钮
,则子
文本块
也将被禁用

您只需将
添加到HyperLinkStyle中,但我建议您改为创建LinkButtonStyle,这样您的最终标记填充将更加清晰:

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

这只会让你的观点更清晰

以下是我的链接按钮模板:

<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>

您只需将
添加到您的超链接样式中,但我建议您改为创建LinkButtonStyle,这样您的最终标记填充将更加清晰:

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

这只会让你的观点更清晰

以下是我的链接按钮模板:

<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>