Wpf 禁用扩展器时折叠扩展器

Wpf 禁用扩展器时折叠扩展器,wpf,Wpf,我有一个扩展器,我希望用户能够扩展/折叠。但是,我想在IsEnabled设置为false时折叠扩展器 这项工作: myExpander.IsEnabledChanged += (sender, e) => { if (!((Expander)sender).IsEnabled) ((Expander)sender).IsExpanded = false; }; 但我希望有一个更干净的解决方案,可能是一种风格或一种装订 我试过: <Style x:Key="NotesExp

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

这项工作:

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的值

有什么建议吗


关于David

这是一个依赖项属性设置优先级的问题(例如读取和)。 一旦用户以交互方式更改IsExpanded,此值的优先级将高于样式触发器

一个可能的解决办法是沿着这些思路

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


这是一个依赖项属性设置优先级的问题(读取例如and)。 一旦用户以交互方式更改IsExpanded,此值的优先级将高于样式触发器

一个可能的解决办法是沿着这些思路

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


非常感谢您的链接。我知道发生了什么-现在我知道为什么了!非常感谢您的链接。我知道发生了什么-现在我知道为什么了!
private void exp_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    var exp = sender as Expander;
    exp.SetCurrentValue(Expander.IsExpandedProperty, !exp.IsExpanded);
    e.Handled = true;
}