可点击的文本块?

21

我有一个WP7应用程序,想要在其中拥有一个可"点击"的TextBlock区域,当用户单击TextBlock时,它会将其放入编辑模式(不同的控件)。

这将为用户编辑文本增加另一个明确的步骤。

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

是否有任何方法可以实现此功能?包含在另一个控件中,或类似的东西?

8个回答

23

是的,有一个鼠标点击事件。它被称为MouseLeftButtonDown。

textBlock1.MouseLeftButtonDown +=new MouseButtonEventHandler(textBlock1_MouseLeftButtonDown);

private void textBlock1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{

}

1
检查用户滚动时事件是否不会触发。当用户开始手势/滑动时,按钮的点击足够智能以被取消。 - Luke Puplett
1
根据我的测试,MouseLeftButtonUp 的作用与 click 完全相同。为什么不试试呢? - Haozhun
4
请注意,7.1(Mango)增加了“Tap”事件。 - Michael Itzoe

14

我通过创建一个带有TextBlock的模板的按钮来解决了这个问题,代码如下:

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

这需要更多的标记,但你不需要编写任何代码,它由框架提供并正常工作。


@KaanonMacFarlane 你是什么意思? - Louis Rhys

7
您可以使用手势支持来关联点击事件。 编辑:通过这种方式,您的行为将与单击(轻敲)相一致,用户在操作过程中移动手指时不会触发单击。 单击不会在 mousedown、移开控件、mouseup 下触发。 轻拍手势也是如此。 并非所有用户都知道他们可以通过移动鼠标/手指来中止单击,但有些人确实知道,如果没有正确处理它,您就会被卡住。 MouseLeftButtonUp 处理方式也是一样的,但我不建议依赖它,因为它不是按设计来的,可能会出现意外的更改或与其他控件冲突。

@Alan 我不同意你的负评理由。我也不同意你的解决方案。在所有情况下,按下鼠标左键并不行为一致地与单击事件相对应。你主张保持简单,我认为标记的答案是解决方案的近似值。因为你的负评,我不觉得有必要移除这个答案。 - Mick N
+1,这里没有降低评分的理由。关于手势支持的提示很好! - Fredrik Hedblad

5

有一些答案建议使用MouseLeftButton事件,但我看到很多例子都行不通。我建议将TextBlock(或其他控件)放入带有自定义样式的Button中(除了内容控件外删除所有边框/边距)。这样做会更好得多!

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

你需要按照我的答案所述创建 OnlyContentStyle 样式。 - Ku6opr
那你怎么做呢?我认为你的想法更好,但是你的回答不够详细。而且有一些引用缺失... - vidstige
@Ku6opr 请进一步解释如何创建那种样式,以便按钮使用。 - Migisha
2
在 Blend 中:右键单击按钮,编辑模板 - 编辑副本。然后删除所有边框、动画等。 - Ku6opr

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

2

看起来你只需要一个按钮。更改控件模板以去除边框样式等,并制作自己的(或清除现有的)可视状态。甚至可以编辑它,使“按下”状态给出一些三维投影。

此外,如果你正在使用MVVM,你也可以在按钮上使用命令。

Luke


0
可以使用PointerReleased捕获UWP控件的点击事件。

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

我更喜欢添加一个事件,然后动态完成其余的部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接