【问题标题】:"Clickable" textblock?“可点击”文本块?
【发布时间】:2010-11-29 21:19:59
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    textBlock1.MouseLeftButtonDown +=new MouseButtonEventHandler(textBlock1_MouseLeftButtonDown);
    
    private void textBlock1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
    
    }
    

    【讨论】:

    • 检查当用户滚动时事件不会触发。当用户开始手势/滑动时,按钮的单击非常智能,可以取消。
    • 根据我的测试,MouseLeftButtonUp 的行为与点击完全一样。为什么不试试呢?
    • 请注意,7.1 (Mango) 添加了 Tap 事件。
    【解决方案2】:

    我已经通过在其模板中创建一个带有 TextBlock 的按钮来解决这个问题,如下所示:

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

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

    【讨论】:

    • @KaanonMacFarlane 你是什么意思?
    【解决方案3】:

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

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

    【讨论】:

    • @Alan 我不同意你投反对票的理由。我也不同意你的解决方案。在所有情况下,MouseLeftButton down 在行为上都与单击事件不一致。您认为保持简单,我认为标记的答案是解决方案的近似值。由于您的投票,我认为没有理由删除此答案。
    • +1,没有理由在这里投反对票。关于手势支持的好提示!
    【解决方案4】:

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

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

    【讨论】:

    • 您需要创建OnlyContentStyle 我的回答中提到的样式
    • 你是怎么做到的?我只是认为您的想法要好得多,但是您的回答不是很彻底。还有一些引号丢失...
    • @Ku6opr 请进一步解释如何创建按钮使用的样式。
    • 在 Blend 中:右键单击按钮,编辑模板 - 编辑副本。比删除所有边框、动画等
    【解决方案5】:

    另一种方法是使用 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 );
         }
    }
    

    【讨论】:

      【解决方案6】:

      听起来你只需要一个按钮。更改控件模板以删除边框样式等并制作您自己的(或清除现有的)视觉状态。甚至可以对其进行编辑,使“沮丧”状态提供一点 3D 投影。

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

      卢克

      【讨论】:

        【解决方案7】:
        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;
            }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-27
          • 2010-12-10
          • 2016-04-27
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多