UserControl не отображается в дизайнере

287
23 февраля 2017, 23:19

Есть UserControl

Вот его разметка

<UserControl x:Class="WpfApplication22.RatingBar"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApplication22"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             x:Name="ratingBar" Loaded="ratingBar_Loaded">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="RatingBarDefaultStyle.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <ItemsControl ItemsPanel="{Binding PanelTemplate, ElementName=ratingBar}"
                  ItemsSource="{Binding Buttons, ElementName=ratingBar}"
                  ItemTemplate="{Binding ButtonTemplate, ElementName=ratingBar}"
                  HorizontalAlignment="Center" VerticalAlignment="Center">
    </ItemsControl>
</UserControl>

Код я приводить не стал, потому что его много и я не знаю что тут может пригодиться.

Суть вот в чем. Контрол должен отрисовывать некие объекты по количеству равному значению некоторого DependencyProperty (по умолчанию 5).

Так вот, в рантайме все отлично работает, но в дизайнере контрол не отрисовывается. Помогите разобраться.

UPD

Привожу код RatingBarDefaultStyle.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WpfApplication22">
    <Style TargetType="local:RatingBar">
        <Setter Property="PanelTemplate">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ButtonTemplate" >
            <Setter.Value>
                <DataTemplate DataType="local:RatingButton">
                    <CheckBox IsChecked="{Binding IsChecked}"/>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

UPD2

Привожу код свойств для темплейтов

public DataTemplate ButtonTemplate
{
    get { return (DataTemplate)GetValue(ButtonTemplateProperty); }
    set { SetValue(ButtonTemplateProperty, value); }
}
public static readonly DependencyProperty ButtonTemplateProperty =
    DependencyProperty.Register("ButtonTemplate", typeof(DataTemplate), typeof(RatingBar), new FrameworkPropertyMetadata(default(DataTemplate)));
public ItemsPanelTemplate PanelTemplate
{
    get { return (ItemsPanelTemplate)GetValue(PanelTemplateProperty); }
    set { SetValue(PanelTemplateProperty, value); }
}
public static readonly DependencyProperty PanelTemplateProperty =
    DependencyProperty.Register("PanelTemplate", typeof(ItemsPanelTemplate), typeof(RatingBar), new FrameworkPropertyMetadata(default(ItemsPanelTemplate)));

Полагаю, дело в дефолтных значениях для свойств зависимостей. Они по умолчанию равны null, а должны иметь какое то дефолтное значение. Не знаю пока че с этим делать.

Answer 1

WPF не поддерживает подключение стилей по умолчанию в самом контроле. Кроме того, у таких стилей по умолчанию есть еще одна проблема: явно заданный пользователем стиль отменит все ваши настройки по умолчанию вместо того чтобы перекрывать их по одной.

Вместо использования стилей разместите ваши шаблоны в словаре ресурсов после чего укажите в качестве значения по умолчанию при создании DependencyProperty.

READ ALSO
Вывод с двух коллекций одновременно

Вывод с двух коллекций одновременно

У меня есть две коллекции, которые нужно вывести в одном циклеКак мне лучше всего это реализовать? Можно ли использовать foreach или нет?

257
Ajax запрос в контролеру

Ajax запрос в контролеру

привет есть запрос

303
Шаблонные классы и функции

Шаблонные классы и функции

Предположим, имеется следующая структура классов:

251
Собрать почту по POP3 и передать по SMTP

Собрать почту по POP3 и передать по SMTP

Необходимо организовать сбор почты со стороннего сервера по POP3, обработать письма и по SMTP отправить на наш сервер microsoft exchangeДак вот, как собрать...

275