В WPF, как мне дать своему пользовательскому элементу управления стиль по умолчанию для использования в режиме разработки? - PullRequest
3 голосов
/ 05 августа 2009

Я создал пользовательский элемент управления WPF. Элемент управления действует как контейнер с различными областями (поэтому он может работать как главная страница).

Стиль для этого элемента управления загружается во время выполнения из отдельного словаря ресурсов следующим образом:

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/MyApp.Application;component/Themes/Theme.xaml" x:Name="theme"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

Стиль моего пользовательского элемента управления выглядит следующим образом ...

<Style TargetType="{x:Type shareduc:EditControlMaster}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type shareduc:EditControlMaster}">
                <Grid>
                    <Grid.ColumnDefinitions></Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto"></RowDefinition>
                        <RowDefinition Height="*"></RowDefinition>
                    </Grid.RowDefinitions>

                    <Border BorderBrush="{DynamicResource xxBorderBrush}" 
                                BorderThickness="0,1,0,1" Background="White" Grid.Row="0">
                        <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="auto"></RowDefinition>
                                <RowDefinition Height="auto"></RowDefinition>
                            </Grid.RowDefinitions>

                            <ContentPresenter Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Margin="10" Content="{TemplateBinding Image}"  />
                            <ContentPresenter Grid.Row="0" Grid.Column="1" Margin="2" Content="{TemplateBinding Title}"  />
                            <ContentPresenter Grid.Row="1" Grid.Column="1" Margin="2" Content="{TemplateBinding Abstract}"  />
                        </Grid>
                    </Border>

                    <ContentPresenter Grid.Row="1" Margin="2" Content="{TemplateBinding Content}" />

                </Grid>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Проблема в том, что этот стиль загружается только во время выполнения. Таким образом, в режиме разработки мой элемент управления не имеет никакого стиля и не имеет никакого размера или макета. Как я могу присвоить своему элементу управления стиль по умолчанию для режима дизайна?

Обновление : Я делаю некоторые успехи ... кажется, я могу указать тему по умолчанию для использования в файле с именем Themes \ Generic.xaml. Это отлично работает в небольшом примере проекта, но по какой-то причине мой дизайнер VS2008 остается пустым, когда я делаю то же самое в моем реальном проекте ... Помощь? (

Обратите внимание, что код моего пользовательского элемента управления выглядит следующим образом:

public partial class EditControlMaster : Control
    {
        static EditControlMaster()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(EditControlMaster),
              new FrameworkPropertyMetadata(typeof(EditControlMaster)));
        }

        public object Title
        {
            get { return (object)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }

        public static readonly DependencyProperty TitleProperty =
          DependencyProperty.Register("Title", typeof(object),
          typeof(EditControlMaster), new UIPropertyMetadata());



        public object Image
        {
            get { return (object)GetValue(ImageProperty); }
            set { SetValue(ImageProperty, value); }
        }

        public static readonly DependencyProperty ImageProperty =
          DependencyProperty.Register("Image", typeof(object),
          typeof(EditControlMaster), new UIPropertyMetadata());


        public object Abstract
        {
            get { return (object)GetValue(AbstractProperty); }
            set { SetValue(AbstractProperty, value); }
        }

        public static readonly DependencyProperty AbstractProperty =
          DependencyProperty.Register("Abstract", typeof(object),
          typeof(EditControlMaster), new UIPropertyMetadata());

        public object Content
        {
            get { return (object)GetValue(ContentProperty); }
            set { SetValue(ContentProperty, value); }
        }

        public static readonly DependencyProperty ContentProperty =
          DependencyProperty.Register("Content", typeof(object),
          typeof(EditControlMaster), new UIPropertyMetadata());
    }

Ответы [ 4 ]

5 голосов
/ 05 августа 2009

Через много ковыряясь в файлах проекта я выяснил, что было не так!

  1. Themes \ Generic.xaml содержит стиль вашего элемента управления по умолчанию. Это хорошо.
  2. Ваш файл Assembly.cs должен содержать следующий атрибут:

    [assembly: ThemeInfo(
        ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
        //(used if a resource is not found in the page, 
        // or application resource dictionaries)
        ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
        //(used if a resource is not found in the page, 
        // app, or any theme specific resource dictionaries)
    )]
    

Вуаля! Дизайнер VS2008 работает!

1 голос
/ 05 августа 2009

Вы пробовали

public EditControlMaster()
{
  DefaultStyleKey = typeof(EditControlMaster);
}

как часть конструктора?

0 голосов
/ 03 октября 2009

По моему опыту, использование DynamicResource в стиле, определенном в themes \ generic.xaml (как вы сделали для Border), не работает (по крайней мере, не всегда). Вы должны рассмотреть возможность изменения этого на поиск StaticResource.

0 голосов
/ 05 августа 2009

Попробуйте переместить стиль в стандартное место.

  • Добавить / Новый элемент / Пользовательский элемент управления (WPF) / «MyDummyControl»
  • теперь поместите ваш стиль в "Themes / Generic.xaml", который был создан
  • удалить файлы и стиль "MyDummyControl"
  • удалите ваш Theme.xaml и MergedDictionaries
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...