Расстояние между настраиваемыми элементами управления WPF Stackpanel

как можно получить пространство между некоторыми настраиваемыми элементами управления внутри панели стека? Я делал это прямо раньше с текстовым полем, кнопкой и т. Д., Но я не могу сделать это с помощью настраиваемого элемента управления.

Это код, который у меня есть

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

Спасибо за вашу помощь


person Daniel DirtyNative Martin    schedule 30.11.2015    source источник
comment
Что такое SmartTaskOverview? Я создал проект, создал SmartTaskOverview (наследует ContentControl), и все отлично ...   -  person Spawn    schedule 30.11.2015
comment
Ваш SmartTaskOverview наследуется от UserControl? Если у вас есть другая панель стека в качестве корневого компонента в SmartTaskOverview, это может испортить поля.   -  person Alex    schedule 30.11.2015
comment
SmartTaskOverview - это настраиваемый элемент управления, наследуемый от UserControl.   -  person Daniel DirtyNative Martin    schedule 30.11.2015


Ответы (1)


FrameworkElements и их подклассы не просто ищут ресурс, используя тип элементов управления, они используют значение DefaultStyleKey. Обычной практикой для большинства подклассов Control (и некоторых других FrameworkElements) является переопределение значения по умолчанию этого свойства зависимости в статическом конструкторе на тип элемента управления, но подклассы UserControl обычно не беспокоят.

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

Если вы этого не сделали в своем SmartTaskOverview, он будет искать свой стиль по умолчанию, используя typeof(UserControl) в качестве ключа ресурса, а не typeof(SmartTaskOverview).

Примечание. 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>
person Brian Reichle    schedule 30.11.2015
comment
Итак, если я правильно вас понял, мне нужно создать статический метод, подобный упомянутому вами, внутри моего класса Custom Control? Что ж, если я это сделаю, все элементы управления исчезнут. - person Daniel DirtyNative Martin; 30.11.2015
comment
Да, если вы хотите переопределить стиль по умолчанию, как в вопросе, вам нужно будет предоставить подходящий DefaultStyleKey; и лучший способ сделать это - переопределить его значение по умолчанию в статическом конструкторе. Я обновил свой ответ, чтобы охватить отсутствующие элементы управления. - person Brian Reichle; 30.11.2015
comment
Что ж, сначала спасибо, но обе версии не решают мою проблему. Первое решение дает мне ошибку Указанное значение не может быть присвоено. Ожидается следующий тип: Стиль А второе решение просто больше ничего не показывает - person Daniel DirtyNative Martin; 01.12.2015
comment
Извините, пропустил пару деталей (бывает при записи этих вещей по памяти). Я обновил свой ответ и убедился, что он работает. - person Brian Reichle; 01.12.2015
comment
Хм, я думаю, что делаю что-то не так, в вашей обновленной версии 2 теперь отображаются элементы управления, но оба решения не оставляют границ для SmartTaskOverviews снимок экрана - person Daniel DirtyNative Martin; 01.12.2015
comment
Попробуйте использовать snoop для проверки фактического значения, возможно, он получает значение из другого источника с более высоким приоритетом. - person Brian Reichle; 01.12.2015
comment
Я никогда не работал со snoop, но думаю, что нашел правильные записи: Pic1 Pic2 Pic3 Pic4 Pic5 - person Daniel DirtyNative Martin; 01.12.2015
comment
Вам нужно сосредоточиться на свойстве Margin вашего SmartTaskOverview, поскольку это то, что вы пытаетесь установить в своем стиле. - person Brian Reichle; 01.12.2015
comment
о, извините, вот изображение, посвященное снимку экрана SmartTaskOverview - person Daniel DirtyNative Martin; 01.12.2015
comment
Ваш последний снимок экрана показывает, что маржа установлена ​​на 0,0,0,0, а источник значения - локальный. Это указывает на то, что кто-то устанавливает его непосредственно в элементе управления, вне любого шаблона или стиля. Такие значения всегда имеют приоритет над значениями, предоставленными стилями / шаблонами / триггерами / и т. Д. Я предлагаю вам найти, где вы его устанавливаете, и либо удалить его, либо изменить на значение, которое вы действительно хотите. - person Brian Reichle; 01.12.2015
comment
Да, верно, прямо внутри SmartTaskOverview было установлено Margin = 0. Спасибо большое за вашу помощь!! - person Daniel DirtyNative Martin; 01.12.2015