Начало работы с производным пользовательским элементом управления? - PullRequest
1 голос
/ 19 августа 2010

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

  • Я создал проект настраиваемого элемента управления в VS 2010 и изменил базовый класс для CustomControl1 с Control на Calendar.

  • Затем я вошел в Generic.xaml и удалил стиль по умолчанию, созданный для CustomControl1.

  • Наконец-то я создал приложение WPF для использования элемента управления.

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

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

Может кто-нибудь прояснить это для меня? Спасибо за вашу помощь.

Кстати - зачем я это делаю? Я расширяю элемент управления Calendar, но мне нужно только изменить шаблон элемента управления CalendarDayButton. Прежде чем перейти к моим модификациям, я решил, что сначала должен отобразить неизмененный Календарь. Как я уже сказал, я думаю, что где-то ошибочно предполагаю.

CustomControl1.cs Вот код для CustomControl1:

using System.Windows;
using System.Windows.Controls;

namespace WpfCustomControlLibrary1
{
     public class CustomControl1 : Calendar
     {
          static CustomControl1()
          {
               DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
          }
     }
}

Generic.xaml Вот разметка для Generic.xaml, которая находится в папке Темы элемента управления:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCustomControlLibrary1">


</ResourceDictionary>

MainWindow Наконец, вот разметка MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

        xmlns:WpfCustomControlLibrary1="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1" Title="MainWindow" Height="350" Width="525">
    <Grid>
        <WpfCustomControlLibrary1:CustomControl1 />
    </Grid>
</Window>

WpfApplication1 содержит ссылку на проект WpfCustomControlLibrary1.

Ответы [ 3 ]

4 голосов
/ 19 августа 2010

DefaultStyleKeyProperty.OverrideMetadata (typeof (CustomControl1), новый FrameworkPropertyMetadata (typeof (CustomControl1)));

-> Эта строка говорит о том, что CustomControl1 имеет стиль по умолчанию, определенный в Generic.xaml

Затем я вошел в Generic.xaml и удалил стиль по умолчанию, созданный для CustomControl1.

-> Это удаляет стиль по умолчанию для CustomControl1

То есть у вашего элемента управления нет стиля, поэтому он ничего не показывает: D

Вместо удаления стиля из generic.xaml, вам следует скопировать стиль элемента управления Calender и изменить TargetType на CustomControl1 или создать новый стиль и добавить BasedOn Calender

Редактировать , чтобы добавить немного информации к ответу Дэвида ниже для людей, которые смотрят в будущее

<Style TargetType="{x:Type local:FsCalendar}" BasedOn={x:Type Calender}>
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource FsCalendarDayButtonStyle}" />
</Style>

Это все, что вам нужно в стиле. BasedOn позаботится о копировании всего в стиле по умолчанию и , а также позаботится о различных темах. Если вы скопируете стиль из стандартной темы календаря, вы нарушите внешний вид всех тем, кроме той, из которой вы скопировали стиль «по умолчанию».

1 голос
/ 20 августа 2010

Я нашел свой ответ - спасибо NVM за помощь! Это в целом относится к элементам управления, но особенно к элементу управления Calendar. Если вы собираетесь изменять только часть элемента управления, вам не нужно включать все составляющие шаблоны элементов управления.

Но вам нужно включить основной шаблон элемента управления, который вы указываете на свой пользовательский элемент управления, и вы должны установить цепочку от основного элемента управления до шаблона, который вы хотите изменить. В случае моего элемента управления Calendar мне нужно изменить только шаблон CalendarDayButton, чтобы реализовать изменения, которые я хочу внести. Итак, вот что я сделал:

  • Я включил основной шаблон Календаря и указал его на свой пользовательский элемент управления.

  • Затем, чтобы перейти к CalendarDayButton, я добавил установщик свойств, чтобы указать свойство CalendarDayButtonStyle моего основного стиля календаря на мой собственный стиль CalendarDayButton.

Вот как выглядит главное объявление стиля календаря в моем файле Generic.xaml:

<!-- Calendar Style -->
<Style TargetType="{x:Type local:FsCalendar}">
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource FsCalendarDayButtonStyle}" />
...
</Style>

Остальная часть основного стиля календаря не изменилась - это копия стиля по умолчанию.

Кстати, определение стиля CalendarDayButton должно появиться до определения основного стиля календаря в Generic.xaml, иначе основной стиль календаря не сможет его найти.

Я написал статью проекта кода под названием Расширение элемента управления календаря WPF . Он проходит этап расширения сложного элемента управления, такого как календарь WPF. Надеюсь, это поможет другим, кто борется с теми же проблемами.

0 голосов
/ 13 сентября 2010

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

...