在 WPF Expander 控件上改变边框的角半径?

Altering border's corner radius on WPF Expander control?

WPF Expander 控件中可视化树的最高层是一个边框元素(见屏幕截图)。默认情况下,它的 CornerRadius3。是否可以修改此值?

我暂时将标记作为答案,但我设法实现了如下解决方案:

使用 stylesnooper 我获得了用于 'standard' Expander 控件的样式/控件模板。

然后发现它并没有像预期的那样表现,发现 <ToggleButton IsChecked="False" ... 行是错误的,实际上应该是 <ToggleButton IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"...

一切都按预期进行。

我做了一个 behavior,它修改了 ControlTemplate 中找到的第一个 border。您可以使用您想要修改的新属性轻松扩展行为


/// <summary>
/// modifies the first found <see cref="Border"/> in the <see cref="ControlTemplate"/> of the attached <see cref="Control"/>
/// </summary>
public class ModifyBorderBehavior : Behavior<Control>
{
    // ##############################################################################################################################
    // Properties
    // ##############################################################################################################################

    #region Properties

    /// <summary>
    /// The new corner radius
    /// </summary>
    public CornerRadius CornerRadius
    {
        get => (CornerRadius)GetValue(CornerRadiusProperty);
        set => SetValue(CornerRadiusProperty, value);
    }

    /// <summary>
    /// The <see cref="CornerRadius"/> DependencyProperty.
    /// </summary>
    public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(ModifyBorderBehavior));

    #endregion

    // ##############################################################################################################################
    // Constructor
    // ##############################################################################################################################

    #region Constructor

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Loaded += _OnLoaded;
    }

    private void _OnLoaded(object sender, RoutedEventArgs e)
    {
        //var children = VisualTree.GetVisualChildCollection<Border>(sender);            
        if (sender is Control control)
        {
            Border border = VisualTree.GetVisualChild<Border>(control);
            if(ReadLocalValue(CornerRadiusProperty) != DependencyProperty.UnsetValue)
                border.CornerRadius = CornerRadius;
        }
    }

    #endregion
}    

<Expander>
    <i:Interaction.Behaviors>
        <zls:ModifyBorderBehavior CornerRadius="0"/>
    </i:Interaction.Behaviors>
</Expander>