2010-11-29 3 views
19

У меня есть приложение WP7, где я бы хотел иметь «clickable» TextBlock область, когда пользователь нажимает на TextBlock, он помещает его в режим редактирования (другое управление). Это добавит еще один явный шаг для пользователя перед редактированием текста."Clickable" textblock?

Нет события click для TextBlock (что меня не удивляет).

Есть ли способ сделать это? Обернутый другим контролем или что-то подобное?

ответ

21

Да, есть событие click. Его название MouseLeftButtonDown

textBlock1.MouseLeftButtonDown +=new MouseButtonEventHandler(textBlock1_MouseLeftButtonDown); 

private void textBlock1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 

} 
+0

Это сработало отлично. Спасибо! – pearcewg 2010-11-30 02:31:48

+1

Убедитесь, что событие не срабатывает при прокрутке пользователя. Щелчок кнопки достаточно умный, чтобы его можно было отменить, когда пользователь начал жестом/салфеткой. – 2010-12-18 18:38:00

+0

Также хороший момент от Люка. – 2010-12-27 01:24:19

7

Вы можете связать событие click с помощью поддержки жестов.

Редактировать:, делая это таким образом, чтобы ваше поведение было согласовано с щелчком (касанием) относительно пользователя, перемещающего палец по экрану во время операции. Щелчок не будет срабатывать под mousedown, отключить управление, mouseup. Жест жеста работает одинаково. Не все пользователи знают, что они могут прервать щелчок, перемещая мышь/палец, но некоторые делают, и вы поймаете это, если не будете правильно его обрабатывать. Обработка MouseLeftButtonUp работает одинаково, но я бы не рекомендовал полагаться на это, поскольку это не по дизайну, и могут быть непредвиденные изменения или конфликты с другими элементами управления.

2

Похоже, вам просто нужна кнопка. Измените шаблон управления, чтобы удалить стиль оформления и т. Д. И создать свои собственные (или очистить существующие) визуальные состояния. Или даже отредактируйте его, так что состояние «депрессия» дает небольшую 3D-проекцию.

Кроме того, с помощью кнопки вы также можете использовать команду на кнопке, если вы используете MVVM.

Люк

3

Другой способ сделать это использует решение Севы, но добавив немного больше, прокрутка не будут вызывать «Клик»

bool _IsMouseDown = false; 

private void Textblock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    _IsMouseDown = true; 
} 

private void Textblock_MouseLeave(object sender, MouseEventArgs e) 
{ 
    _IsMouseDown = false; 
} 

private void Textblock_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    if (_IsMouseDown) 
    { 
     _IsMouseDown = false; 

     //ITS a CLick do something! 
     Textblock clickedButton = (Textblock)sender; 
     AddNumberToRolledNumbers(Convert.ToInt32(clickedButton.Tag),clickedButton.Background); 
    } 
} 
0
private void txtPersonName_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var txtPersonName = e.OriginalSource as TextBlock; 

     if (txtPersonName == null) return; 

     MouseButtonEventHandler eveMouseLeftButtonUp = (sen, eve) => NavigationService.Navigate(new Uri("/Views/PersonPage.xaml?personId=" + txtPersonName.Tag, UriKind.RelativeOrAbsolute)); 
     MouseEventHandler eveMouseMove = (sen, eve) => txtPersonName.MouseLeftButtonUp -= eveMouseLeftButtonUp; 

     txtPersonName.MouseLeftButtonUp += eveMouseLeftButtonUp; 
     txtPersonName.MouseMove += eveMouseMove; 
    } 

Я предпочитаю, чтобы добавить одно событие и сделайте все остальное динамически.

4

Существует несколько ответов, которые помогут использовать события MouseLeftButton, но я видел много примеров, когда этот подход идет не так. Я рекомендую поместить TextBlock (или другие элементы управления/управления) в кнопку с пользовательским стилем (удалены все границы/поля, кроме управления содержимым). Это МНОГО ЛУЧШЕ!

<Button Style={StaticResource OnlyContentStyle}> 
     <Button.Content> 
      <TextBlock /> 
     </Button.Content> 
</Button> 
12

Я решил эту проблему путем создания кнопки с TextBlock внутри его шаблон:

<Button Click="button_Click"> 
    <Button.Template> 
     <ControlTemplate> 
      <TextBlock ... /> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 

Это немного больше разметки, но вам не нужно писать код, то предоставляемые структурой и работающие должным образом.

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