对于父级,IsEnabled = false,但应启用子级

时间:2013-12-06 13:03:22

标签: c# wpf xaml

我有一个包含大量组件的XAML页面,其中只有组件是一个表,看起来像这样

<UserControl>
   <ScrollViewer CanContentScroll="True" HorizontalScrollBarVisibility="Disabled"  VerticalScrollBarVisibility="Auto" PanningMode="VerticalOnly">
      <FlowDocumentScrollViewer IsToolBarVisible="False">
         <FlowDocument IsHyphenationEnabled="False">
            <Table Style="{StaticResource UniversalListTemplate}" Margin="0" Padding="0">
               <Table.Columns>
                  <TableColumn Width="70" />
                  <TableColumn Width="170" />
                  <TableColumn Width="210" />
               </Table.Columns>
               <TableRowGroup>
                  <TableRow>
                     <TableCell>
                        <Paragraph>
                           <ContentControl Content="{StaticResource Time}" />
                        </Paragraph>
                     </TableCell>
                     <TableCell>
                        <Paragraph>
                           <ContentControl Content="{StaticResource Text}" />
                        </Paragraph>
                     </TableCell>
                     <TableCell>
                        <Paragraph>
                           <ContentControl Content="{StaticResource Measurement}" />
                        </Paragraph>
                     </TableCell>
                  </TableRow>
                  <TableRow Background="Gray" FontSize="0.1">
                     <TableCell ColumnSpan="5" />
                  </TableRow>
               </TableRowGroup>
               <TableRowGroup x:Name="TableDataRows"> />
            </Table>
         </FlowDocument>
      </FlowDocumentScrollViewer>
   </ScrollViewer>
</UserControl>

页面上的所有项目都应该被禁用,但是我需要滚动这个组件,它不应该改变项目的颜色。

所以我可以为这个组件覆盖IsEnabled,所以这总是被启用?

2 个答案:

答案 0 :(得分:1)

如果禁用父容器而不是子容器,则无法更改

答案 1 :(得分:0)

我通过创建一个简单的包装元素来解决这个问题,该元素打破了父元素的 IsEnabled 继承链。

框架的默认强制回调检查父 IsEnabled 值并继承它。这个控件设置了一个新的强制回调,直接返回值而不检查继承。

public class ResetIsEnabled : ContentControl
{
    static ResetIsEnabled()
    {
        IsEnabledProperty.OverrideMetadata(
            typeof(ResetIsEnabled),
            new UIPropertyMetadata(
                defaultValue: true,
                propertyChangedCallback: (_, __) => { },
                coerceValueCallback: (_, x) => x));
    }
}

可以这样使用

<ParentControl IsEnabled="False">
  <!-- Any elements here will have IsEnabled set to false, inherited from the parent -->
  <ResetIsEnabled>
    <!-- Any child elements here will have IsEnabled set to true (the default value) -->
  </ResetIsEnabled>
</ParentControl>

在此问题的具体示例中,您会将 <ScrollViewer><ResetIsEnabled> 包装在一起,以不从父级继承 IsEnabled 并启用滚动。如果需要禁用 ScrollViewer 中表格的内容,则可以在表格上设置 IsEnabled="False" 以禁用表格的所有子内容。