【问题标题】:WPF listboxitem PreviewKeyDownWPF listboxitem PreviewKeyDown
【发布时间】:2014-03-06 18:26:52
【问题描述】:

我有一个绑定到自定义对象列表的列表框。我可以使用 xaml 中的 ListBox.ItemTemplate 正确显示列表框项目。列表框的自定义对象都是下面列出的相同基类。

public class HomeViewMenuItem : UIElement
{
    private Uri _uri;
    private IRegionManager _manager;

    public HomeViewMenuItem(string text, Uri uri, IRegionManager manager)
    {
        this.PreviewMouseDown += HomeViewMenuItem_PreviewMouseDown;
        this.PreviewKeyDown += HomeViewMenuItem_PreviewKeyDown;
        _manager = manager;
        Text = text;
        _uri = uri;
        ClickCommand = new DelegateCommand(this.Click, this.CanClick);
    }

    void HomeViewMenuItem_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == System.Windows.Input.Key.Enter)
        {
            e.Handled = true;
            this.ClickCommand.Execute();
        }
    }

    void HomeViewMenuItem_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        e.Handled = true;
        this.ClickCommand.Execute();
    }

    private void Click()
    {
        _manager.Regions[RegionNames.MainRegion].RequestNavigate(_uri);
    }

    private bool CanClick()
    {
        return true;
    }

    public DelegateCommand ClickCommand { get; set; }

    public string Text { get; set; }
}

我遇到的问题是没有调用 HomeViewMenuItem_PreviewKeyDown 方法。我相信这是因为该方法首先在 ListBoxItem 本身上被调用并在那里得到处理。在 ItemContainerGenerator 状态更改为 ContainersGenerated 并在那里添加事件处理程序后,我能够通过 listBox.ItemContainerGenerator.ContainerFromIndex(0) 获取对 ListBoxItem 对象的引用来验证这一点。此事件处理程序正确触发。通常这对于一个小项目来说是一个不错的解决方案,但我计划拥有更多具有相同功能的列表框,并希望有一个更简单/更好的解决方案。有没有办法让我的基类 previewkeydown 方法工作?

我能想到的唯一解决方案是让基类继承自 ListBoxItem 而不是 UIElement,然后让 ListBox 来创建我的项目而不是 ListBoxItems。但如果不创建我自己的 ListBox 实现,我认为这是不可能的。

【问题讨论】:

    标签: wpf listbox prism-4


    【解决方案1】:

    您似乎有些困惑。在 WPF 中,我们创建 数据项 并声明 DataTemplates 以定义这些项在 UI 中的外观。我们的数据项扩展 UI 类。如果您必须处理PreviewKeyDown 事件,则将处理程序附加到DataTemplate 中的UI 元素

    <DataTemplate>
        <Grid PreviewKeyDown="HomeViewMenuItem_PreviewKeyDown">
            ...
        </Grid>
    </DataTemplate>
    

    【讨论】:

    • 不要混淆,你的建议是我开始时已经拥有的。我想要一个更可重用的解决方案,因为我需要其他地方的 keydown 功能。我会将您的答案标记为正确,因为它回答了我提出的问题,尽管我最终创建了 listbox 和 listboxitem 的自定义实现,以便我可以在其他地方重用它。
    猜你喜欢
    • 2011-05-22
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2010-09-12
    相关资源
    最近更新 更多