我有一个包含大量组件的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,所以这总是被启用?
答案 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"
以禁用表格的所有子内容。