«Кликабельный» текстовый блок? - PullRequest
19 голосов
/ 30 ноября 2010

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

Для TextBlock нет события щелчка (что меня не удивляет).

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

Ответы [ 7 ]

21 голосов
/ 30 ноября 2010

Да, есть событие щелчка.Его называют MouseLeftButtonDown

textBlock1.MouseLeftButtonDown +=new MouseButtonEventHandler(textBlock1_MouseLeftButtonDown);

private void textBlock1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{

}
12 голосов
/ 26 декабря 2011

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

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

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

7 голосов
/ 30 ноября 2010

Вы можете связать событие щелчка, используя поддержку жестов.

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

5 голосов
/ 06 декабря 2011

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

 <Button Style={StaticResource OnlyContentStyle}>
      <Button.Content>
           <TextBlock />
      </Button.Content>
 </Button>
3 голосов
/ 06 июня 2011

Еще один способ сделать это - использовать решение Seva, но добавив немного больше, чтобы прокрутка не вызывала 'Click'

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 );
     }
}
2 голосов
/ 30 ноября 2010

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

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

Люк

0 голосов
/ 04 ноября 2011
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;
    }

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

...