Silverlight Xaml 覆盖控件的 IsEnabled 属性

Posted

技术标签:

【中文标题】Silverlight Xaml 覆盖控件的 IsEnabled 属性【英文标题】:Silverlight Xaml Overriding IsEnabled Property of Control 【发布时间】:2016-09-22 20:01:07 【问题描述】:

我有一个 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(与上述代码相反)时,则不起作用。

【问题讨论】:

这样做的目的是什么?您是否知道禁用父控件会阻止子控件的所有消息,因此它们将无法对任何输入做出反应?也许你可以通过使用状态来实现要求?就像在父控件看起来像禁用时创建“阻止”状态一样? 是的,我知道,在运行时,根据某些条件我需要禁用。但是对于数据网格,我想让它始终独立于这个 userControl 启用。 【参考方案1】:

首先:如果禁用父级,则所有子级都将被禁用。时期。你无法改变这一点,这实际上是一件好事。因为通过这种方式,您可以绝对可靠地阻止所有用户输入到整个 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 以禁用包含的子树。

【讨论】:

感谢您的精彩解释。我想你是对的。但是我有很多孩子,只是因为孩子的一种不同行为,我应该将 IsEnabled 添加到所有孩子还是树的所有成员?这是我从你的回答中了解到的。 添加了一个例子,希望对您有所帮助。

以上是关于Silverlight Xaml 覆盖控件的 IsEnabled 属性的主要内容,如果未能解决你的问题,请参考以下文章

怎么在aspx加入xaml

Expression Blend实例中文教程 - 布局控件快速入门Grid

覆盖 XAML 中的控件模板属性

Silverlight 业务应用程序初始化检查

是否可以在ControlTemplate中包含Xaml资源?

将 WPF XAML 代码移植到 Silverlight XAML 代码