Silverlight Xaml 覆盖控件的 IsEnabled 属性
Silverlight Xaml Overriding IsEnabled Property of Control
我有一个 Silverlight 项目。在项目中我有一个 UserControl。此 UserControl 的 IsEnabled 是动态设置的,大部分时间设置为 false。
在这个 UserControl 中,我有几个嵌套的网格,所有网格都像往常一样从它们的父级 (UserControl) 继承 IsEnable。
但是,对于此 UserControl 中的其中一个网格,我不想继承此功能。我想始终将其设置为 True。有没有办法覆盖 IsEnabled 功能?
我试过的是,我用 ContentControl 包装并将 IsEnabled 设置为 True,但它不起作用。
<ContentControl IsEnabled="True">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Margin="0,0,0,0" BorderThickness="0">
<HistoryControls:EditableMAMGridContainer StateInfo="{Binding Path=StateInfo, Source={StaticResource Evm}}" />
</ScrollViewer>
</ContentControl>
根是这个 Scrollviewer 的 UserControl,它有几个父级和祖父级。它在很深的地方。
编辑:
此代码有效,但反之亦然无效
<UserControl IsEnabled="True">
.
.
<ContentControl IsEnabled="False">
...
当 UserControl 设置为 False,而 contentControl 设置为 True(上述代码的相反情况)则不起作用。
首先:如果禁用父级,则所有子级都将被禁用。时期。你无法改变这一点,这实际上是一件好事。因为通过这种方式,您可以绝对确保可靠地阻止所有用户输入到 UI.
的整个子树。
不要试图扭曲框架的概念。这里的概念是:禁用绝对意味着不能有任何用户输入!在它的任何部分,不是那个子树的最小角落。
如果我们遵循这个概念,那么我们很快就会明白您实际上不希望您的父级被禁用,因为显然您希望它的一小部分仍然接收用户输入。所以 - 概念上 - 它没有被禁用!
现在如何进行技术翻译?
这意味着您必须以一种方式构建您的树,使您可以禁用它的一个分支,同时仍然启用一个兄弟分支。
例子
<TravelBooking>
<!-- this will be disabled if we don't travel by plane -->
<TransferToAirportPlanner/>
<FlightToDestinationPlanner/>
<ReturnFlightPlanner/>
<TransferFromAirportPlanner/>
<!-- this will always be enabled -->
<HotelPlanner/>
</TravelBooking>
重组树以允许禁用子树
<TravelBooking>
<!-- this will be disabled if we don't travel by plane -->
<AirplaneTravelPlanningControl>
<TransferToAirportPlanner/>
<FlightToDestinationPlanner/>
<ReturnFlightPlanner/>
<TransferFromAirportPlanner/>
</AirplaneTravelPlanningControl>
<!-- this will always be enabled -->
<HotelPlanner/>
</TravelBooking>
现在您可以轻松地禁用 AirplaneTravelPlanningControl 以禁用包含的子树。
我有一个 Silverlight 项目。在项目中我有一个 UserControl。此 UserControl 的 IsEnabled 是动态设置的,大部分时间设置为 false。
在这个 UserControl 中,我有几个嵌套的网格,所有网格都像往常一样从它们的父级 (UserControl) 继承 IsEnable。
但是,对于此 UserControl 中的其中一个网格,我不想继承此功能。我想始终将其设置为 True。有没有办法覆盖 IsEnabled 功能?
我试过的是,我用 ContentControl 包装并将 IsEnabled 设置为 True,但它不起作用。
<ContentControl IsEnabled="True">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Margin="0,0,0,0" BorderThickness="0">
<HistoryControls:EditableMAMGridContainer StateInfo="{Binding Path=StateInfo, Source={StaticResource Evm}}" />
</ScrollViewer>
</ContentControl>
根是这个 Scrollviewer 的 UserControl,它有几个父级和祖父级。它在很深的地方。
编辑: 此代码有效,但反之亦然无效
<UserControl IsEnabled="True">
.
.
<ContentControl IsEnabled="False">
...
当 UserControl 设置为 False,而 contentControl 设置为 True(上述代码的相反情况)则不起作用。
首先:如果禁用父级,则所有子级都将被禁用。时期。你无法改变这一点,这实际上是一件好事。因为通过这种方式,您可以绝对确保可靠地阻止所有用户输入到 UI.
的整个子树。不要试图扭曲框架的概念。这里的概念是:禁用绝对意味着不能有任何用户输入!在它的任何部分,不是那个子树的最小角落。
如果我们遵循这个概念,那么我们很快就会明白您实际上不希望您的父级被禁用,因为显然您希望它的一小部分仍然接收用户输入。所以 - 概念上 - 它没有被禁用!
现在如何进行技术翻译?
这意味着您必须以一种方式构建您的树,使您可以禁用它的一个分支,同时仍然启用一个兄弟分支。
例子
<TravelBooking>
<!-- this will be disabled if we don't travel by plane -->
<TransferToAirportPlanner/>
<FlightToDestinationPlanner/>
<ReturnFlightPlanner/>
<TransferFromAirportPlanner/>
<!-- this will always be enabled -->
<HotelPlanner/>
</TravelBooking>
重组树以允许禁用子树
<TravelBooking>
<!-- this will be disabled if we don't travel by plane -->
<AirplaneTravelPlanningControl>
<TransferToAirportPlanner/>
<FlightToDestinationPlanner/>
<ReturnFlightPlanner/>
<TransferFromAirportPlanner/>
</AirplaneTravelPlanningControl>
<!-- this will always be enabled -->
<HotelPlanner/>
</TravelBooking>
现在您可以轻松地禁用 AirplaneTravelPlanningControl 以禁用包含的子树。