“可点击”文字块?

时间:2010-11-29 21:20:00

标签: .net windows-phone-7 xaml onclick textblock

我有一个WP7应用程序,我希望有一个“可点击的”TextBlock区域,当用户点击TextBlock时,它会将其置于编辑模式(不同的控件)。 这将在编辑文本之前为用户添加另一个显式步骤。

TextBlock没有点击事件(这并不让我感到惊讶)。

有没有办法做到这一点?包含在另一个控件或类似的东西中?

7 个答案:

答案 0 :(得分:21)

是的,有点击事件。它叫做MouseLeftButtonDown

textBlock1.MouseLeftButtonDown +=new MouseButtonEventHandler(textBlock1_MouseLeftButtonDown);

private void textBlock1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{

}

答案 1 :(得分:12)

我已经通过在其模板中创建一个带有TextBlock的Button来解决这个问题:

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

它有点标记,但您不需要编写任何代码,它由框架提供并且可以正常工作。

答案 2 :(得分:7)

您可以使用手势支持关联点击事件。

编辑:通过这样做,您的行为将与用户在操作期间在显示屏上移动手指的点击(点击)一致。点击不会在mousedown下触发,移开控制,mouseup。点按手势也是如此。并非所有用户都知道他们可以通过移动他们的鼠标/手指来中止点击,但有些用户会这样做,如果没有正确处理它,你就会被抓住。 MouseLeftButtonUp处理的工作方式相同,但我不建议依赖它,因为它不是设计上的,可能会出现意外的更改或与其他控件的冲突。

答案 3 :(得分:5)

有几个答案建议使用MouseLeftButton事件,但我看到了很多这种方法出错的例子。 我建议将TextBlock(或其他控件/控件)放入具有自定义样式的Button中(删除除内容控件之外的所有边框/边距)。它好多了!

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

答案 4 :(得分:3)

另一种方法是使用Seva的解决方案,但添加更多,因此滚动不会触发'点击'

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 );
     }
}

答案 5 :(得分:2)

听起来你只需要一个按钮。更改控件模板以删除边框样式等,并创建自己的(或清除现有的)可视状态。或者甚至编辑它以使“凹陷”状态给出一点3D投影。

此外,使用按钮,如果您使用MVVM,也可以使用按钮上的命令。

答案 6 :(得分: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;
    }

我更喜欢添加一个事件并动态完成其他事件。