Създаване на Silverlight UserControl

Създавам потребителска контрола silverlight, която трябва да мога да плъзгам и пускам чрез смесване. Но тази контрола трябва да приеме карта, която вече е на страницата.

За напр.

  1. Main.xaml съдържа контрола за карта.
  2. MapEditor.xaml съдържа бутони и други контроли. Във файла .cs той трябва да получи достъп до контрола на картата (тази в Main.xaml).

Как да направя това?

Мислех да добавя параметър в конструктора за MapEditor, но как да предам картата като параметър в режим на проектиране?

Благодаря.

пс. Ще разделя този контрол в библиотека silverlight, така че да може да се използва в множество проекти по-късно.


person Shawn Mclean    schedule 23.01.2010    source източник


Отговори (1)


Не искате да давате на контрола си параметризиран конструктор, XAML ще конструира типове само с помощта на техния конструктор по подразбиране.

Прост подход

Най-лесният подход би бил да добавите DependencyProperty към вашия контрол, на който бихте присвоили контрола Map (ще използвам името на типа MyMap в този пример):-

public MyMap Map
{
    get { return (MyMap)GetValue(MapProperty); }
    set { SetValue(MapProperty, value); }
}

public static DependencyPropery MapProperty = new DependencyProperty("Map",
    typeof(MyMap), typeof(MapEditor), new PropertyMetaData(null));

Сега в Blend свойството Map ще се появи в категорията Разни в раздела Свойства. След това можете да използвате раздела „Свойство на елемента“ на „Създаване на обвързване на данни“, за да изберете контролата на картата, към която трябва да се обвърже.

Твърд подход

Това каза, че бих бил склонен да създам правилна контрола с възможност за персонализиране, следвайки тези указания Създаване на нова контрола чрез създаване на ControlTemplate. С допълнението, че бих разширил базовия клас ContentControl и ще включа ContentPresenter в основата на шаблона. Контролата ще направи предположението, че дъщерната контрола е MyMap контрола.

Този подход позволява целият външен вид на контролата MapEditor да бъде стилизиран в Blend и позволява контролата Map, която трябва да бъде „редактирана“, да бъде плъзгаща и пускана върху MapEditor като дъщерна контрола.

person AnthonyWJones    schedule 23.01.2010
comment
В последния ред какво е MyControl във функцията typeof(MyControl)? - person Shawn Mclean; 03.02.2010
comment
@Shawn: Съжалявам, трябваше да сложа MapEditor там, за да стане ясно. В този параметър вие указвате типа на контролата, с която е свързано свойството на зависимост. Това позволява на различни контроли да регистрират свойства с едно и също име (без това само една контрола би могла някога да има свойство Text, това никога не би станало). Ще редактирам. - person AnthonyWJones; 03.02.2010
comment
Здравейте, още един въпрос, как изглежда xaml за новата контрола със свойството Map по отношение на предаването на обекта карта към нея? - person Shawn Mclean; 04.02.2010
comment
@Shawn: Това е добър въпрос сам по себе си, но тъй като контролата Map вече съществува във вашия XAML другаде, предполагам, че искате да се свържете с нея. Да приемем, че вашият Map има x:Name="MyMap". Следователно вашето Map свойство ще изглежда като Map="{Binding ElementName=MyMap}" - person AnthonyWJones; 04.02.2010