【问题标题】:Collapse an Expander when it is disabled禁用时折叠扩展器
【发布时间】:2015-08-25 08:45:15
【问题描述】:

我有一个扩展器,我希望用户能够展开/折叠。但是,当 IsEnabled 设置为 false 时,我想折叠 Expander。

这行得通:

myExpander.IsEnabledChanged += (sender, e) => 
{ 
  if (!((Expander)sender).IsEnabled) ((Expander)sender).IsExpanded = false; 
};

但我希望有一个更简洁的解决方案,可能是样式或绑定。

我试过了:

<Style x:Key="NotesExpander" TargetType="Expander" >
    <Setter Property="IsExpanded" Value="True" />
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="IsExpanded" Value="False" />
        </Trigger>
    </Style.Triggers>
</Style>

在用户以交互方式设置 IsExpanded 之前一直有效。一旦用户点击手动展开,样式就不再提供 IsExpanded 的值。

有什么建议吗?

问候大卫

【问题讨论】:

    标签: wpf


    【解决方案1】:

    这是依赖属性设置优先级的问题(例如link1link 2)。 用户以交互方式更改 IsExpanded 后,此值的优先级高于您的样式触发器。

    一个可能的解决方案是沿着这些思路......

    将 PreviewMouseDown="exp_PreviewMouseDown" 添加到您的扩展器。 在此事件处理程序中,使用 DependencyObject.SetCurrentValue 更新值,而不是让 Expander 更新值本身(这将覆盖您的样式触发器):

    private void exp_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        var exp = sender as Expander;
        exp.SetCurrentValue(Expander.IsExpandedProperty, !exp.IsExpanded);
        e.Handled = true;
    }
    

    【讨论】:

    • 非常感谢您的链接。我知道发生了什么——现在我知道为什么了!
    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多