Silverlight - привязка пользовательского элемента управления - PullRequest
2 голосов
/ 03 декабря 2009

Я изучаю Silverlight. В процессе я пытаюсь создать пользовательский элемент управления. Моя конечная цель - написать следующее заявление на XAML:

<my:CustomControl>
  <my:CustomControl.MainControl>
    <Canvas><TextBlock Text="Hello!" /></Canvas>
  </my:CustomControl.MainContent>
</my:CustomControl>

Содержимое элемента управления будет обернуто в пользовательскую рамку. Еще раз, это просто учебное упражнение. Чтобы добавить мою границу, я создал следующий UserControl:

<UserControl x:Class="CustomControl"
    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">

    <Grid x:Name="LayoutRoot">
      <Border>
        <!-- CustomControl Content -->
      </Border>
    </Grid>
</UserControl>

Код для этого файла выглядит следующим образом:

public partial class CustomControl : UserControl
{
  public UIElement MainContent
  {
    get { return (UIElement)GetValue(MainContentProperty); }
    set { SetValue(MainContentProperty, value); }
  }

  public static readonly DependencyProperty MainContentProperty =
    DependencyProperty.Register("MainContent", typeof(UIElement), typeof(CustomControl),  
    new PropertyMetadata(null));


  public CustomControl()
  {
    InitializeComponent();            
  }
}

У меня проблема с отображением MainContent в моем CustomControl. Я уверен, что правильно его настраиваю, но не уверен, как это отобразить. Я действительно хочу, чтобы это был также DependencyProperty, чтобы я мог использовать преимущества привязки данных и анимации.

Как заставить MainContent появляться в CustomControl? Спасибо

1 Ответ

2 голосов
/ 03 декабря 2009

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

public CustomControl()
{
    InitializeComponent();
    Loaded += new RoutedEventHandler(CustomControl_Loaded);
}

Затем в загруженном событии присвойте свойство MainControl свойству Child границы. Чтобы сделать это лучше всего, если вы дадите своей границе x:Name, которую я сейчас просто назову "граница".

void CustomControl_Loaded(object sender, RoutedEventArgs e)
{
    border.Child = MainControl;
}

Это поможет тебе. Конечно, вам может потребоваться динамически изменять свойство MainControl, поэтому вам нужно добавить поле bool isLoaded в свой элемент управления и установить его в загруженном событии. Когда true, ваш MainControl установщик должен назначить входящее значение для border.Child.

Все может начать усложняться, и на самом деле я не рекомендую такой подход к созданию пользовательского элемента управления. Для лучшего подхода см. Создание нового элемента управления путем создания ControlTemplate

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