WPF点击事件处理程序获取TextBlock文本

3

我有一个在XAML中的文本块:

<DataTemplate x:Key="InterfacesDataTemplate"
              DataType="ca:Interface">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="1" Text="{Binding Path=Name}" 
                   MouseLeftButtonDown="interface_mouseDown"/>
    </Grid>
</DataTemplate>

在代码后台,我有一个处理点击(双击)的事件处理程序。

private void interface_mouseDown(object sender, MouseButtonEventArgs e)
{
    var tb = sender as TextBox;
    if (e.ClickCount == 2)
        MessageBox.Show("Yeah interfac " + tb.Text);
}

我遇到了一个空引用异常。

4个回答

7
var tb = sender as TextBox

这会导致结果为null,因为它实际上是一个TextBlock。只需更改为:
var tb = sender as TextBlock

1
很可能发送方必须是TextBlock。为了将来,您应该检查发送方是否为null,以便再次不引发异常:
var tb = sender as TextBlock;

if (tb != null)
{
    // doing something here
}

0

为了使其更紧凑和简单,只需进行以下更改:

private void interface_mouseDown(object sender, MouseButtonEventArgs e)
{
   if (e.ClickCount == 2)
    MessageBox.Show("Yeah interfac " + ((TextBlock)sender).Text);
}

-1

哦,糟糕,我没看到你想要将其转换为 TextBox 而不是 TextBlock。假设你想要 TextBlock,请参考下面的内容:

我不使用代码后台事件,尽量使用命令来完成所有操作。然而,一个我可以立即尝试的解决方法是给控件命名,并在代码后台直接访问它,像这样:

    <TextBlock Grid.Column="1" x:Name="MyTextBlock"
           Text="{Binding Path=Name}" MouseLeftButtonDown="interface_mouseDown"/>
        </Grid>
    </DataTemplate>

然后可以在后端进行访问:

  private void interface_mouseDown(object sender, MouseButtonEventArgs e)
  {
    if (MyTextBlock.ClickCount == 2)
        MessageBox.Show("Yeah interfac " + MyTextBlock.Text);
  }

请注意,我可能是错的,但我不知道“ClickCount”是否是TextBlock或TextBox控件上的导航属性。

请在评论中解释为什么将参数转换为-1。 - TMan

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