【问题标题】:How UserControl can tell when it's visibleUserControl 如何判断它何时可见
【发布时间】:2014-02-14 15:01:30
【问题描述】:

我的 MainWindow 中有一个如下所示的 UserControl:

<ctrls:Login Visibility="{Binding DataContext.Vis,
                          RelativeSource={RelativeSource Mode=FindAncestor,
                                                          AncestorType=Window}},
                          Converter={StaticResource BooelanToVisibilityConverter}"/>

所以它的可见性绑定到 MainWindow 的 ViewModel 中的属性 Vis。

我想知道的是,在 UserControl 的 ViewModel 中,当可见性发生变化时,我该如何拾取?我想在可见时启动计时器并在隐藏时停止它。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    您可以在 userControl 上挂钩 UIElement.IsVisibleChanged 事件:

    <ctrls:Login IsVisibleChanged="Control_VisibleChanged"/>
    

    背后的代码:

    private void Control_VisibleChanged(object sender, 
                                            DependencyPropertyChangedEventArgs e)
    {
        if ((bool)e.NewValue)
        {
           // Visible code here
        }
        else
        { 
           // Collapse code here
        }
     }
    

    如果您想启动 Timer,我认为从后面的代码中执行此操作没有问题。

    但是,如果您仍然希望在 ViewModel 中得到通知,您可以在 UserControl ViewModel 中创建一个 ICommand 并使用 interaction triggers 绑定到此事件

    <ctrls:Login>
       <i:Interaction.Triggers>
          <i:EventTrigger EventName="IsVisibleChanged">
              <i:InvokeCommandAction Command="{Binding VisibleChangedCommand}"/>
          </i:EventTrigger>
       </i:Interaction.Triggers>
    </ctrls:Login>
    

    您可以参考这篇文章here,以防交互触发器对您来说是新事物。

    【讨论】:

    • 他希望在视图模型中得到通知,而不是在控件的代码隐藏中
    • e.NewValue 是一个布尔值,而不是可见性类型。您的代码应显示 if ((bool)e.NewValue) { // IsVisible code here} ...
    • @RohitVats 我尝试了这两种方式,并且我已经理解了第一种方式,但是我在用户控制视图模型第二个示例中遇到了 ICommand 问题,请问您有这个工作的示例吗?
    • 你需要在你的项目中引用Microsoft.Expression.Interactivity.Coredll才能使用它。请参考示例herehere 或者只需使用交互触发器MVVM 在google 上搜索,您将在那里获得大量参考。
    • 这不起作用,因为 IsVisibleChanged 是一个 CLR 事件,这已经在:stackoverflow.com/questions/6497449/mvvm-binding-to-clr-events 和:stackoverflow.com/questions/21819812/… 中得到了回答
    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2011-02-16
    • 2014-05-03
    相关资源
    最近更新 更多