WPF单击事件处理程序获取文本块文本

时间:2014-04-25 13:27:36

标签: c# wpf event-handling

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

我收到了NullReferenceException。

4 个答案:

答案 0 :(得分:6)

var tb = sender as TextBox

这导致null,因为它实际上是TextBlock

只需更改为

var tb = sender as TextBlock

答案 1 :(得分:1)

sender最有可能是 TextBlock 。对于将来,您应该检查 null 上的发件人,以便再次不会引发异常:

var tb = sender as TextBlock;

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

答案 2 :(得分:0)

为了使它变得紧凑和简单,只需做这些改变:

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

答案 3 :(得分:-1)

哦哦oops没有看到你试图扮演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);
  }

另请注意,如果&#39; ClickCount&#39;是控件TextBlock或TextBox上的nav属性。