如何在自定义ItemsControl的ItemsPresenter中设置项目样式?

时间:2018-09-25 15:45:03

标签: c# wpf xaml itemscontrol itemspresenter

我试图创建一个自定义ItemsControl,该控件显示RadioButtons或Checkboxes并自动将样式应用于这些项目。

这就是我现在拥有的:

自定义ItemsControl:

>>x = [1 2 3;4 5 6]
x =
     1     2     3
     4     5     6
>> xx = x(:)
xx =
     1
     4
     2
     5
     3
     6
>> xx = x(1:end)
xx =
     1     4     2     5     3     6

样式:

public class LabelContainer : ItemsControl
{
    public string Label
    {
        get { return (String)GetValue(LabelProperty); }
        set { SetValue(LabelProperty, value); }
    }

    public static readonly DependencyProperty LabelProperty =
 DependencyProperty.Register("Label", typeof(string),
   typeof(LabelContainer), new PropertyMetadata(""));
}

我正在这样使用它:

<ItemsPanelTemplate x:Key="ItemsPanelTemplate">
    <StackPanel Orientation="Horizontal">
        <StackPanel.Resources>
            <Style TargetType="{x:Type RadioButton}" >
                <Setter Property="Margin" Value="0,0,8,0"/>
            </Style>
        </StackPanel.Resources>
    </StackPanel>
</ItemsPanelTemplate>

<Style TargetType="local:LabelContainer">
    <Setter Property="ItemsPanel" Value="{StaticResource ItemsPanelTemplate}"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:LabelContainer">
                <StackPanel>
                    <TextBlock FontWeight="Medium" Margin="0,0,7,6" Text="{TemplateBinding Label}"/>
                    <ItemsPresenter>
                        <ItemsPresenter.Resources>
                            <Style TargetType="{x:Type RadioButton}">
                                <Setter Property="Margin" Value="0,0,8,0"/>
                            </Style>
                            <Style TargetType="{x:Type CheckBox}">
                                <Setter Property="Margin" Value="0,0,8,0"/>
                            </Style>
                        </ItemsPresenter.Resources>
                    </ItemsPresenter>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

除了对单个项目进行样式设置之外,一切都可以正常工作。在这种情况下,我尝试为单选按钮添加边距。我知道我可以手动为每个项目添加边距,但是我正努力避免这种情况。

我尝试将样式放入主样式的ItemsPresenter.Resources中,并且尝试将其放入ItemsPanelTemplate的StackPanel.Resources中。这两个选项都不起作用,样式不适用。

有什么想法为什么不起作用?

1 个答案:

答案 0 :(得分:0)

我弄清楚了:我必须将RadioButtons和CheckBoxes的样式放在自定义ItemsControl的Style.Resources中。

这是工作代码:

<ItemsPanelTemplate x:Key="ItemsPanelTemplate">
    <StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>

<Style TargetType="local:LabelContainer">
    <Setter Property="ItemsPanel" Value="{StaticResource ItemsPanelTemplate}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:LabelContainer">
                <StackPanel>
                    <TextBlock FontWeight="Medium" Margin="0,0,7,6" Text="{TemplateBinding Label}"/>
                    <ItemsPresenter />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Resources>
        <Style TargetType="{x:Type RadioButton}" BasedOn="{StaticResource {x:Type RadioButton}}">
            <Setter Property="Margin" Value="0,0,8,0" />
        </Style>
        <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type CheckBox}}">
            <Setter Property="Margin" Value="0,0,8,0" />
        </Style>
    </Style.Resources>
</Style>