用户控制的可见性

Posted

技术标签:

【中文标题】用户控制的可见性【英文标题】:Visibility of User Control 【发布时间】:2011-12-20 12:01:37 【问题描述】:

在我的应用程序中有一个侧边栏,其中包含这两个组件:

        <Grid x:Name="AF" Visibility="Visibility">
            <betata:AForm Height="508" VerticalAlignment="Top"/>
        </Grid>
        <Grid x:Name="AN" Visibility="Collapsed">
            <betata:ANav Height="508" VerticalAlignment="Top"/>
        </Grid>

在 AForm 中使用此方法获得超链接按钮:

    private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
    
        Visibility = Visibility.Collapsed;
        Sidebar sb = new Sidebar();
        sb.AN.Visibility = Visibility.Visible;
    

但我不确定为什么 aForm 会折叠但 AN 无法显示。或者是否有任何其他解决方案可以实施::

主页中的这一行调用UC_A ::

<DWDS_LULCS_Views_Sidebar:Sidebar HorizontalAlignment="Left" Width="264"/>
主页 持有 用户控件 A(侧边栏) 持有 用户控制 B(管理员登录表单) 和 用户控制 C(管理导航菜单)

UC_B默认是可见的,点击UC_B中的按钮调用UC_A的UC_C将可见性改为可见?

【问题讨论】:

这整个事情非常令人困惑......首先,Visibility="Visibility" 是错误的,还有,你为什么要这样做?侧边栏 sb = new Sidebar(); 【参考方案1】:

我是这样做的,在全局变量中做一些东西来验证是否让哪个可见和折叠,

另一种方法是使用 mvvm 方法

<Border Background="Red" Visibility="Binding HasChanges, Converter=StaticResource visibilityConverter, FallbackValue=Collapsed">

在你的资源中你需要添加

<local:BooleanToVisibilityConverter x:Key="visibilityConverter" OnTrue="Visible" OnFalse="Collapsed" />

然后你可以拥有一个全局对象,你可以在你的控件的构造函数之后设置它 初始化组件(); DataContext=new GlobalObjectKnownAsViewModel(); // 是Binding的来源

这种方法将是一个很好的开始,稍后您可以考虑使用 PRISM/mvvm light 来实现它们为 mvvm 工作提供的其他行为和基础设施。

【讨论】:

【参考方案2】:

终于解决了这个问题...我这样做是在全局变量中制作一些东西以验证是否使哪个可见和折叠,然后将一个事件处理程序提供给侧边栏(layout_updated)。当我修改 UC_B 的可见性时,UC_A 将受到影响,触发器将被调用。最后,UC_A 的 layout_updated 事件将改变 UC_C 的可见性变为可见。

【讨论】:

以上是关于用户控制的可见性的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 DataTemplates 设置控制的可见性

使用复选框控制 DataTables 列的可见性

RBAC简介

Thymeleaf 登录和注销可见性问题

网页制作:HTML5 标准提供了哪些新的 API

JWT的权限控制与Shiro入门