WPF Stackpanel 自定义控件之间的间距

WPF Stackpanel spacing between custom controls

如何在堆栈面板内的某些自定义控件之间获得 space?我以前用文本框、按钮等就做过,但我不能用自定义控件来做。

这是我目前得到的代码

<Grid>
    <StackPanel x:Name="spTasks" CanVerticallyScroll="True">
        <StackPanel.Resources>
            <Style TargetType="local:SmartTaskOverview">
                <Setter Property="Margin" Value="50,50,50,50" />
            </Style>
        </StackPanel.Resources>
    </StackPanel>

</Grid>

感谢您的帮助

FrameworkElement 及其子 类 不只是使用控件类型查找资源,它们还使用 DefaultStyleKey 的值。对于大多数子 类 控件(以及其他一些 FrameworkElement )来说,在静态构造函数中覆盖此依赖项 属性 的默认值是控件类型的常见做法,但是 UserControl 的子 类 通常不会打扰。

static Foo()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(Foo), new FrameworkPropertyMetadata(typeof(Foor));
}

如果您没有在 SmartTaskOverview 中执行此操作,那么它将使用 typeof(UserControl) 作为资源键而不是 typeof(SmartTaskOverview).[=22= 来寻找其默认样式]

注意:UserControl 将需要一个控件模板来显示其子项,这通常由 UserControl 的默认样式提供,但通过更改键,它将找到您的默认样式。要解决此问题,只需将您的样式基于 UserControl 样式即可。

<Style TargetType="local:SmartTaskOverview" BasedOn="{StaticResource {x:Type UserControl}}">
    <Setter Property="Margin" Value="50,50,50,50" />
</Style>

或者您可以自己提供一个简单的模板。

<Style TargetType="local:SmartTaskOverview">
    <Setter Property="Margin" Value="50,50,50,50" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:SmartTaskOverview}">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>