【问题标题】:Caliburn.Micro ShowPopup - set focusCaliburn.Micro ShowPopup - 设置焦点
【发布时间】:2013-05-02 16:38:02
【问题描述】:

我正在尝试使用 Caliburn.Micro(用于我的第一个 WPF MVVM 项目)并且我正在努力让 WindowManager.ShowPopup 方法将焦点设置到弹出屏幕。这可能吗? Caliburn 的 HelloWindowManager 示例也没有这样做,而且文档也很简单。

【问题讨论】:

  • 你想让你的弹出窗口是模态的吗?
  • 想知道在其中一个弹出窗口控件上调用Focus 是否可行(我认为没有一种方法可以专注于实际弹出窗口本身)。如果是这样,您可以创建一些功能以在视图上按名称查找元素(使用IViewAware.GetView())并在虚拟机启动后将其聚焦。
  • 我最终得到了这个组合使用 ShowWindow(不是 ShowPopup),还使用 ​​EventAggregator 将事件发布到被调用窗口的 ViewModel ......在那里我设置了一个属性并使用了 DataTrigger通过 FocusManager 设置焦点的视图。这可能是一个 hack,但它似乎有效。
  • 对我来说听起来不像是 hack - 没有理由视图不能依赖于事件聚合器之类的服务,并且您在视图模型和视图关注点之间保持良好的分离 - 你应该发布作为答案,我会投票:)
  • wpf 弹出焦点很痛苦......即使没有caliburn本身,我也无法让它工作......在调用popup.IsOpen = true之后,我尝试了几种方法来聚焦第一个控件在弹出窗口中,没有运气

标签: wpf mvvm caliburn.micro


【解决方案1】:

最终,我无法让 ShowPopup 方法按我的意愿工作。

我所做的是使用 ShowWindow,然后在显示窗口时使用 EventAggregator 发布事件。在调用视图的 ViewModel 中,我订阅了该事件,并将 ViewModel 上的一个属性设置为 true(在本例中名为 KeywordEntryActive)。

然后我在 Grid 上使用一个 Style,它使用绑定到该属性的 DataTrigger 来调用 View 中的 FocusManager.FocusedElement 方法。

<Grid.Style>
    <Style>
        <Style.Triggers>
            <DataTrigger Binding="{Binding KeywordEntryActive}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=Command}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Grid.Style>

这似乎没有我希望的那么简单,但我能够在不牺牲 ViewModel 和 View 分离的情况下完成我正在寻找的东西,所以我对这一点感到满意。 Caliburn.Micro 有一些学习曲线,但到目前为止,我已经能够克服遇到的障碍,并且我将继续沿着这条道路前进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多