Чрезвычайно запутанный о ContentPresenter - PullRequest
4 голосов
/ 06 сентября 2010

К вашему сведению, я довольно новичок в Silverlight.

Хорошо, я хочу создать простой пользовательский элемент управления, который содержит кнопку и дополнительный XAML, как указано клиентом элемента управления.

Я начал поиск в Google и нашел, по крайней мере, 30 разных статей, которые были очень запутанными; особенно потому, что они говорят о стилизации анимации, настройке других элементов управления, которые вам не принадлежат, и других дерьмах, к которым я еще не готов.

Это то, что я сделал.

  • В VS 2010 я щелкнул правой кнопкой мыши и добавил новый UserControl под названием MyControl
  • В MyControl.xaml я изменил LayoutRoot на StackPanel и добавил внутри него кнопку
  • В свой MainPage.xaml я добавил экземпляр MyControl
  • Я добавил TextBox в качестве дочернего элемента этого экземпляра
  • Я попытался собрать и получил ошибку, что MyControl не поддерживает Direct Content

Погуглил еще немного ..

  • Я изменил MyControl для наследования от ContentControl и обновил xaml
  • Я добавил ContentPresenter в xaml, чтобы представить клиенту «пользовательский контент»

Хорошо, он собирается, и TextBox появляется, но кнопка отсутствует.

Вот соответствующий раздел из MainPage.xaml

<my:MyControl HorizontalAlignment="Left" Margin="49,26,0,0" x:Name="myContentControl1" VerticalAlignment="Top" Height="550" Width="389">
     <TextBox Height="72" HorizontalAlignment="Left" Margin="166,339,0,0" Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="460" />
</my:MyControl>

Вот MyControl.xaml

<ContentControl x:Class="ContentControlTest.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="480" d:DesignWidth="480">

    <StackPanel x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}" Orientation="Vertical">
        <ContentPresenter/>
        <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="78,254,0,0" Name="FooFoo" VerticalAlignment="Bottom" Width="160" />
    </StackPanel>
</ContentControl>

А вот и MyControl.cs

using System.Windows.Controls;

namespace ContentControlTest
{
    public partial class MyControl : ContentControl
    {
        public MyControl()
        {
            InitializeComponent();
        }
    }
}

Мне показалось, что это работает так, что дочерние элементы экземпляра элемента управления устанавливаются как свойство Content в базовом классе ContentControl MyControl. Затем ContentPresenter «вставляет» этот контент в MyControl.xaml, где бы он ни появлялся.

Хотя похоже, что так оно и есть, в процессе «съедает» кнопку, которую я определил в MyControl.xaml.

Я пытаюсь не заходить в ControlTemplate и т. Д., Пока это не является абсолютно необходимым.

Может кто-нибудь с подсказкой подскажите, пожалуйста, что я делаю не так.

спасибо!

1 Ответ

5 голосов
/ 06 сентября 2010

Это потому, что Контент элемента управления - это вся StackPanel, которую вы написали от руки; когда вы устанавливаете новый контент, StackPanel заменяется.

ControlTemplate необходим для этого сценария, я думаю; это было бы очень просто в конце концов. Отправной точкой может быть стиль по умолчанию для элемента управления контентом ; поместите стиль в ResourceDictionary (например, в разделе <ContentControl.Resources> вашего пользовательского элемента управления), и вы готовы к работе; все, что вам нужно сделать, это добавить сетку и кнопку внутри этого шаблона.

Обратите внимание, что стиль, с которым я связался, устанавливает себя по умолчанию для любого достижимого ContentControl; чтобы применить его только к вашему элементу управления, а не ко всем дочерним элементам, которые могут появляться внутри него, добавьте x:Key="someKey" к стилю и явно установите для свойства ContentControl's Style значение Style={StaticResource someKey}.

Дайте мне знать, если вам нужна дополнительная информация; Кроме того, я могу ошибаться, и может быть более легкий путь, но я сомневаюсь в этом; свойство Content должно вести себя точно так же, как вы описали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...