Ну, если элемент на странице, с которым вы хотите манипулировать из UserControl, всегда будет TextBlock
, вы можете передать ссылку на него в UserControl. Для этого необходимо создать свойство зависимостей типа TextBlock
внутри UserControl и сохранить ссылку в закрытом поле, так что вы можете получить доступ к нему внутри обработчика событий данной кнопки:
private TextBlock _myText;
public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register(
"MyText", typeof (TextBlock), typeof (uc), new PropertyMetadata(default(TextBlock), PropertyChangedCallback));
public TextBlock MyText
{
get { return (TextBlock) GetValue(MyTextProperty); }
set { SetValue(MyTextProperty, value); }
}
private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
{
var self = dependencyObject as uc;
var element = args.NewValue as TextBlock;
if (self != null && element != null)
self._myText = element;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (_myText != null)
_myText.Visibility = Visibility.Collapsed;
}
В этом случае, вы» d связать TextBlock
с UserControl, как:
<TextBlock x:Name="SomeTextBlock"/>
<local:uc MyText="{Binding ElementName=SomeTextBlock}"/>
конечно, вы можете также использовать свойство зависимостей типа UIElement
быть более гибкими.
В качестве альтернативы, определить событие внутри UserControl, который срабатывает при щелчке на кнопку, и пусть сама страница решить, что делать в этом случае (например, скрыть некоторые TextBlock
):
public partial class uc : UserControl
{
public event EventHandler OnButtonClicked;
private void Button_Click(object sender, RoutedEventArgs e)
{
if (OnButtonClicked != null)
OnButtonClicked(this, new EventArgs());
}
}
public partial class MainPage : Page
{
public MainPage()
{
uc.OnButtonClicked += (sender, args) =>
{
SomeTextBlock.Visibility = Visibility.Collapsed;;
};
}
}
Очень хороший и толковый ответ! Будучи новичком в этом виде кода, второй вариант для меня более понятен. Единственное, что меня немного задевает, это то, что я должен создать новый экземпляр uc на главной странице. Я пытаюсь работать с mvvm, чтобы избежать этого. Можно ли использовать аналогичный код в подходе MVVM? Но вы очень хорошо ответили на мой вопрос, поэтому я буду принимать это как ответ. – user2915962
Поскольку целью 'uc' является отображение кнопки и отображение/скрытие текстового элемента (который явно принадлежит логике View), я не вижу, как создание экземпляра' uc' внутри страницы (который принадлежит слой «Вид») будет противоречить MVVM. – andreask