这是我的XAML代码:
<ListBox ItemsSource="{Binding}" Name="listBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel Width="370">
<TextBlock Text="{Binding AuthorName}" x:Name="author" MouseEventLeftDown="click"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
点击处理程序
private void click(object sender, RoutedEventArgs e)
{
if(author.Text.Equals("Hi"))
{
// Do Something Special
}
}
错误是:
错误:当前上下文中不存在名称“author”
但我不明白导致此错误的原因或原因。
答案 0 :(得分:3)
点击处理程序范围内不存在名称为author
的 TextBlock ,因为它位于 DataTemplate 中。发生的事情是author
TextBlock 为您的每个数据项创建一次(可能是某个Author类或某类Book类),因此您实际上可以拥有数十个控件名为author
。
最好将点击处理程序中的sender
转换为文本框,然后检查其文本属性。像这样:
private void click(object sender, RoutedEventArgs args)
{
var textBox = sender as TextBox;
if(textBox == null)
return;
if(textBox.Text.Equals("hi"))
{
// Do Something Crazy!
}
}
答案 1 :(得分:0)
使用专为触摸设计的UI元素(例如HyperlinkButton或Button)可能更好。您可以按照您想要的方式设置这些样式 - 特别是如果您使用Expression Blend - 但是包含一些关于Touch的视觉反馈是一个很好的设计。
另外 - 我不确定你的==
代码 - 你是否将发送者(一个UI元素)与一些字符串表达进行比较?
答案 2 :(得分:0)
首先,你的TextBlock在DataTemplate中定义;在TextBlock上尝试x:Name
而不是Name
。
其次,单击TextBlock可能会非常棘手,因为您必须按TextBlock中的精确像素。为了更轻松地点击您的TextBlock,您可能需要在Background
上添加TextBlock
,这样点击起来会容易得多。您甚至可以使背景透明:
Background="Transparent"
答案 3 :(得分:0)
使用手势监听器创建一个事件处理程序,如“tap”或double“或者其他。
答案 4 :(得分:0)
使用此...
private void click(object sender, RoutedEventArgs e)
{
var author = (TextBlock)sender;
if (author.Text.Equals("Hi"))
{
// Do Something Special
}
}