WPF События и ссылки на объекты и как ими управлять - PullRequest
0 голосов
/ 06 апреля 2009

У меня есть небольшое приложение WPF, в котором есть Canvas и Grid. Я поместил некоторые пользовательские элементы управления в Grid. Теперь я хотел бы запечатлеть на них некоторые события мыши. В результате одного события я хотел бы добавить (или изменить) что-то на холст. Однако в пользовательском элементе управления нет ссылки на базовый холст. Первый вопрос, есть ли способ получить эту ссылку, например, как getElementById (..) в JavaScript.

Также я знаю, что вам следует избегать таких ссылок, если вы хотите чистую архитектуру. В этом случае рекомендуется отлавливать события на конкретном пользовательском элементе управления, а затем иметь возможность вызывать что-то для другого объекта.

Ответы [ 2 ]

1 голос
/ 06 апреля 2009

WPF имеет новую архитектуру событий, которая может вам здесь помочь. Так называемые «перенаправленные» события могут либо «туннелировать» от логического корневого контейнера через все промежуточные контейнеры к элементу-источнику события, либо «пузыриться» от исходного элемента (т. Е. События «туннелирования» и «всплытия» распространяются в противоположных направления).

Все это говорит о том, что вы обычно можете перехватывать события от дочерних элементов, регистрируя обработчик событий в контейнере. Вот пример перехвата событий нажатия кнопок от кнопок в StackPanel:

<StackPanel ButtonBase.Click="HandleButtonClick">
    <Button>Foo</Button>
    <Button>Bar</Button>
</StackPanel>

И HandleButtonClick может быть реализовано так:

private void HandleButtonClick(object sender, RoutedEventArgs e)
{
    var button = e.OriginalSource as Button;
    if (button != null) MessageBox.Show(button.Content.ToString());
}

В зависимости от того, какой тип «пользовательских элементов управления» вы используете, это может быть невозможно. Это потому, что не все события являются «перенаправленными» событиями. Управляющие события WPF обычно перенаправленные события.

1 голос
/ 06 апреля 2009

У вас есть доступ к Canvas, Grid или любому другому элементу в вашем UserControl. Самый простой способ получить к ним доступ - это убедиться, что у каждого есть имя, что делается с помощью атрибута x: Name.

<Grid x:Name="myGrid">

Тогда в вашем UserControl вы можете получить к нему доступ через myGrid. Чтобы получить доступ к Grid извне UserControl, вам нужно создать метод в UserControl, который позволял бы вам манипулировать им.

Существует метод this.FindName, который вы можете использовать в UserControl, который эквивалентен getElementById javascript, но вам не нужно его использовать, поскольку вы можете обращаться к объектам напрямую с их именем.

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