2010-08-09 58 views
0

我有一个ItemsControl中的超链接列表,我希望用户能够在超链接有焦点时按下空格键来调用超链接的命令(目前按下enter键也可以做到这一点 - 但它不是那么可发现的IMO) 。这是我的ItemsControl decl:如何让WPF ItemsControl项目在按空格键时触发命令?

<ItemsControl x:Uid="_commandsItemsControl" Name="_commandsItemsControl" Grid.Row="1" Grid.Column="2" Grid.RowSpan="4" ItemsSource="{Binding Commands}" Background="Transparent" 
        ScrollViewer.CanContentScroll="False" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" 
        HorizontalAlignment="Stretch" HorizontalContentAlignment="Right" VerticalAlignment="Bottom" Margin="12,0,12,0" BorderThickness="0"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate x:Uid="DataTemplate_1"> 
       <TextBlock x:Uid="TextBlock_1" HorizontalAlignment="Stretch" TextAlignment="Right"> 
        <Hyperlink x:Uid="Hyperlink_1" Command="{Binding Command}"> 
         <Hyperlink.Inlines> 
          <Run x:Uid="Run_1" Text="{Binding DisplayName, Mode=OneWay}"/> 
         </Hyperlink.Inlines> 
        </Hyperlink> 
       </TextBlock> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

这样做的最好方法是什么?

回答

2

将一个KeyDown事件处理程序添加到文本块。在它中检查按键是否空格,如果是,执行该命令。如果我正确理解您的代码,那么textblock的数据上下文将包含该命令。

+0

是的,我在超链接元素上使用了KeyUp处理程序,它工作得很好。 – 2010-08-10 16:31:47

1

我看到的最简单的方法是构建一个简单的自定义控件,它封装了您想要调用的逻辑。 “输入”按钮的功能是超链接的默认命令调用,并且很难更改此设置。

只需构建一个从TextBlock继承的自定义控件。它的样式包含超链接的文本块。使用TemplateBinding将DisplayName和TemplateBinding的TextProperty添加到自定义控件中的新命令依赖项属性。还要在自定义控件的公共构造函数中注册一个预览按键向下事件,在该构造函数中检查您的预期调用键(空格,回车等),并在按下的键适合您的期望时调用该命令。

Jan