Как стилизовать элементы в ItemsPresenter пользовательского ItemsControl?

Я пытаюсь создать собственный ItemsControl, который показывает RadioButtons или Checkboxes и автоматически применяет стили к этим элементам.

Это то, что у меня есть прямо сейчас:

Пользовательские элементы управления:

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>

И я использую это так:

<local:LabelContainer Label="RadioButtons:">
    <RadioButton>Nr 1</RadioButton>
    <RadioButton>Nr 2</RadioButton>
</local:LabelContainer>

Все работает нормально, кроме стилизации отдельных элементов. В этом случае я пытаюсь добавить поле для радиокнопок. Я знаю, что могу добавить поля к каждому элементу вручную, но я пытаюсь этого избежать.

Я попытался поместить стили в ItemsPresenter.Resources основного стиля, и я попытался поместить его в StackPanel.Resources шаблона ItemsPanelTemplate. Оба эти варианта не работают, стили не применяются.

Любые идеи, почему это не работает?


person Jordy    schedule 25.09.2018    source источник


Ответы (1)


Я понял это: мне пришлось поместить стили для RadioButtons и CheckBoxes в Style.Resources пользовательского ItemsControl.

Это рабочий код:

<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>
person Jordy    schedule 25.09.2018