【问题标题】:Bind foreground color to control's IsEnabled state将前景色绑定到控件的 IsEnabled 状态
【发布时间】:2012-03-09 17:53:06
【问题描述】:

我在将我的 Microsoft.Windows.Controls.Ribbon.RibbonTab 对象上的标签颜色绑定到其启用状态时遇到问题。

我先尝试了以下方法:

<Style TargetType="{x:Type r:RibbonTab}">
    <Setter Property="Foreground" Value="White" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsEnabled}" Value="False">
            <Setter Property="Foreground" Value="Gray" />
        </DataTrigger>
    </Style.Triggers>
</Style>

但它对前景没有影响。看起来ribbonTab 库代码中的某些内容以编程方式覆盖了前景。

然后我尝试了这个:

<Style x:Key="BaseRibbonTabStyle" TargetType="{x:Type r:RibbonTab}">
    <EventSetter Event="IsEnabledChanged" Handler="RibbonTab_IsEnabledChanged" 
</Style>

 

private void RibbonTab_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
   if( (bool)e.NewValue == false )
       ((RibbonTab)sender).Foreground = (new System.Windows.Media.BrushConverter()).ConvertFromString("Gray") as System.Windows.Media.Brush;
   else
       ((RibbonTab)sender).Foreground = (new System.Windows.Media.BrushConverter()).ConvertFromString("White") as System.Windows.Media.Brush;
}

但这也因以下编译时错误而失败:

System.Windows.UIElement.IsEnabledChanged="RibbonTab_IsEnabledChanged_Event" is not valid. 'IsEnabledChanged' must be a RoutedEvent registered with a name that ends with the keyword "Event".

我怎样才能让它工作?

【问题讨论】:

  • 那个绑定在我看来刚刚被打破,你甚至在ControlTemplate的上下文中吗?你知道TemplatedParent 是如何工作的吗?有binding errors吗?

标签: c# wpf xaml .net-4.0 styles


【解决方案1】:

尝试一个简单的属性触发器:

 <Style TargetType="{x:Type r:RibbonTab}">
     <Style.Triggers>
         <Trigger Property="IsEnabled" Value="False">
             <Setter Property="Foreground" Value="Gray" />
         </Trigger>
     </Style.Triggers>
     <Setter Property="Foreground" Value="White" /> 
 </Style>

【讨论】:

  • 那行得通。谢谢,我不敢相信我没有先尝试这种更简单的方法。
【解决方案2】:

你试过了吗:

<Style TargetType="{x:Type r:RibbonTab}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsEnabled}" Value="False">
            <Setter Property="Foreground" Value="Gray" />
        </DataTrigger>
    </Style.Triggers>
    <Setter Property="Foreground" Value="White" />
</Style>

【讨论】:

  • @H.B.是的。我已将二传手移到触发器之后。我已经看到这有所作为。请注意,史蒂夫的解决方案做同样的事情。
  • 我可以看到你做了什么;到目前为止,我还没有看到任何情况会有所作为。如果你能告诉我一个我会很感兴趣...
猜你喜欢
  • 2016-01-06
  • 2014-11-05
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多