Помогите понять взаимосвязь ресурсов / стилей / файлов XAML в Silverlight

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

Я смог получить эту работу в некоторой степени, но размещение XAML действительно смущает меня.

На моей странице я использую свой контроль. Это приводит к тому, что моя панель отображается с кнопкой в ​​дочерней области содержимого, которая синего цвета, с желтым заголовком размером 20 пикселей вверху с надписью "Ниже представлен некоторый контент".

<UserControl x:Class="SilverlightApplication9.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SilverlightApplication9">
    <Grid Background="White">        
        <local:MyPanel Background="Blue">            
                <Button Width="50" Height="25" Content="Hello"></Button>            
        </local:MyPanel>    
    </Grid>
</UserControl>

Исходный код моей панели прост, просто:

public partial class MyPanel : ContentControl
{
    public MyPanel()
    {
        DefaultStyleKey = typeof(MyPanel);   
        InitializeComponent();         
    }
}

Это частичный класс, и есть прикрепленный файл XAML, с которого начинается мое замешательство:

Если я пытаюсь поместить свой код стиля / шаблона в XAML-файл частичного класса, он, похоже, игнорируется (отображается моя кнопка, но отсутствует другой контент, такой как цвета и текст).

<ContentControl x:Class="SilverlightApplication9.MyPanel"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SilverlightApplication9">
    <ContentControl.Resources>
        <ResourceDictionary>
            <Style TargetType="local:MyPanel">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="local:MyPanel">
                            <Grid Background="Yellow">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="20" />
                                    <RowDefinition />
                                </Grid.RowDefinitions>
                                <TextBlock HorizontalAlignment="Center" Height="20" Grid.Row="0" Text="Below is some content"/>
                                <Grid Grid.Row="1" Background="LightBlue">
                                    <ContentPresenter />
                                </Grid>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </ContentControl.Resources>
</ContentControl>

Однако, если я создаю файл \Themes\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:SilverlightApplication9"
  xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
  >
    <Style TargetType="local:MyPanel">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:MyPanel">
                    <Grid Background="Yellow">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="20" />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <TextBlock HorizontalAlignment="Center" Height="20" Grid.Row="0" Text="Below is some content"/>
                        <Grid Grid.Row="1" Background="LightBlue">
                            <ContentPresenter />
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

Я явно упускаю что-то важное о том, как ресурсы или файлы XAML обрабатываются или используются в проекте (до Silverlight у меня не было опыта работы с WPF).

Что я делаю неправильно, что мешает мне просто вставить код шаблона панели в файл xaml панели? Есть ли какие-то концепции относительно XAML и ресурсов, которые я ошибаюсь?

1 ответ

Решение

Дэвид, тебе нужно создать ключ для своего стиля и ссылаться на него на панели через его свойство Style... это ограничение Silverlight, которое не позволяет создавать "глобальные" стили, которые применяются ко всем элементам некоторых тип.

Это поведение отличается, когда вы размещаете стиль в темах, как вы заметили.

Другой альтернативой является размещение стиля в ResourceDictionary самой панели, а не элемента управления страницы / пользователя, но тогда вы не сможете повторно использовать этот стиль в других панелях.

Другие вопросы по тегам