2013-07-24 4 views
2

У меня есть UserControl, содержащиеся в родительском окне в WPF. Пользовательский элемент управления содержит кнопку, которая при нажатии вызывает обратную связь с родительским окном и запускает анимацию раскадровки, чтобы установить непрозрачность UserControl на 0, в то же время устанавливая непрозрачность другого UserControl на 1.WPF пользовательское управление работает раскадровка против объекта родительского окна

Так эффективно там является кнопкой внутри моего usercontrol, которая скрывает содержащее usercontrol и переключается на другую видимую.

Если кнопка находится в главном окне, это легко, так как первый пользовательский элемент управления имеет x: имя левой панели, а второй - leftpanelexpanded.

<DoubleAnimation Storyboard.TargetName="Leftpanel" Storyboard.TargetProperty="Opacity" Duration="0:0:0.2" To="0"/> 
<DoubleAnimation Storyboard.TargetName="Leftpanelexpanded" Storyboard.TargetProperty="Opacity" Duration="0:0:0.2" To="1"/> 

Но с помощью кнопки в пользовательском элементе управления, я не могу понять, как у этой анимации целевой «leftpanel» и «leftpanelexpanded» UserControl объекты. Я попытался RelativeSource, но я могу только получить дескриптор родительского окна таким образом, я не могу получить дескриптор пользовательского элемента управления, содержащегося в родительском окне.

Как я могу это сделать?

ответ

0

Ну несколько способов решения этих проблем:

  1. Есть обычай Dependency Property в UserControl, который говорят типа bool. На вашем Button щелкните внутри UserControl, установите для этого параметра bool DP значение true. В родительском Window используйте `Trigger для проверки этого DP и когда True используйте действие BeginStoryboard, чтобы начать Storyboard.

  2. Повторите тот же процесс, что и выше, но используйте свойство Tag вместо специального DP. (Старайтесь избегать этого метода. Просто не слишком приятно)

  3. Создание пользовательского RoutedEvent в вашем UserControl и огонь событие из Button.Click. Попросите родительское окно подписаться на это событие и вызвать раскадровку.

  4. Если используя что-то вроде класса Messenger/EventAggregator, просто отправить сообщение через к родительскому Вид с Button.Click и вызвать раскадровки из родительского вида при получении этого сообщения.

  5. Создать ICommand свойство в вашей родительской точки зрения и есть ваш Button в UserControl связываются с помощью этой команды через RelativeSource связывания или, если это DataContext является родителем окна, вы даже не потребуется RelativeSource для доступа к команде , В командной строке OnExecute(...) запустите раскадровку.

Резюме:

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

Ребенок останавливается в точке запроса изменения состояния, родительский вид - тот, который на самом деле это делает. Это сэкономит вам весь доступ к проблеме управления, а также поможет оставаться верным принципу «Имейте одну вещь беспокоиться об этой вещи и только этой вещи» («предмет», являющийся классом каждого вида здесь)

Смежные вопросы