更改WPF用户控制来自其他用户控件的可见性(登录)

时间:2015-10-03 16:57:55

标签: c# wpf xaml

我使用WPF和C#(没有MVVM)创建了一个应用程序,我有多个用户控件 包含网格,表格和其他东西。但最后我想添加一个登录页面,我开始构建它的方式,默认设置xaml中所有用户控件的可见性折叠:

 Visibility="Collapsed"

并且登录用户控件可见,登录后和后面的C#代码我想将其他用户控件的可见性更改为可见,并将登录页面设置为折叠。

我尝试过类似的东西,但它不起作用:

  Students studentsWin = new Students(); 
  studentsWin.Visibility = Visibility.Visible;

  Members MembersWin = new Members();
  MembersWin.Visibility = Visibility.Visible;

我已经在stackoverflow中读取使用依赖性proprety,因为我从未使用过MVVM,所以我不知道如何使用它:我正在尝试这样的事情:

    public static DependencyProperty WindowVisibilityProperty = DependencyProperty.Register("WindowVisibility", typeof(Visibility), typeof(MemberStats), null);

    public Visibility WindowVisibility
    {
        get
        {
            return (Visibility)GetValue(WindowVisibilityProperty);
        }
        set
        {
            SetValue(WindowVisibilityProperty, value);
        }
    }

但我不知道如何在用户控件的xaml中使用WindowVisibility, 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

  1. 简单的方法。使用以下布局

    <Grid>
      <Grid x:Name="UC_Container">
           <!-- Rest of user controls go here -->
      </Grid>
    
      <uc:UserControl1 x:Name="LoginUC" Background="Aqua"/>            
    </Grid>
    
  2. 隐藏LogiUI本身就像SignIn按钮:点击,如

    this.Visibility = Visibility.Collapsed
    

    您的login-ui将被隐藏,位于下方的网格将包含您的其余部分。

    1. 您正在考虑的方法:您需要在登录UC中使用ShowLoginUI之类的依赖项属性。然后,在用户登录成功后,只需将其设置为false,因为不再需要LoginUI。
    2. 然后在您使用所有控件的MainWindow中,将login-ui容器Grid的可见性绑定到您的LoginUI的ShowLoginUI dep-property。

      无需设置UC_Container的可见性,因为当我们使用网格时,它将被LoginUI隐藏。

      LoginControl可能如下所示:

          public partial class LoginUC : UserControl
              {
                  public bool ShowLoginUI
                  {
                      get { return (bool)GetValue(ShowLoginUIProperty); }
                      set { SetValue(ShowLoginUIProperty, value); }
                  }
      
                  public static readonly DependencyProperty ShowLoginUIProperty =
                      DependencyProperty.Register("ShowLoginUI", typeof(bool), typeof(UserControl1), new PropertyMetadata(true)); 
      
                  ...
      
                  private void SignIn_Click(object sender, RoutedEventArgs e)
                  {
                     // check login credentials
                     // if success
                     ShowLoginUI = false;
                  }
             }
      

      有一个面板用于保存用户控件,另一个面板用于登录UI。 使用Grid作为顶部容器,因为它允许它的孩子堆叠在彼此之上,隐藏下面的那些。 BooleanToVisibilityConverter是您可以使用的内置转换器类。

      <Window.Resources>
              <BooleanToVisibilityConverter x:Key="ConvBoolToVis" />
          </Window.Resources>
      <Grid>
        <Grid x:Name="UC_Container">
             <!-- Rest of user controls go here -->
        </Grid>
        <Grid x:Name="LoginUI_Container" Visibility="{Binding ShowLoginUI, ElementName=LoginUC, Converter={StaticResource ConvBoolToVis}}">
              <uc:UserControl1 x:Name="LoginUC" Background="Aqua"/>
          </Grid>
      </Grid>
      
      1. 最好的方法是使用Frames。框架可以完全分离您的Login-UI和其他UC。
      2. Frames in WPF

答案 1 :(得分:0)

  

学生studentsWin = new MembresList(); //学生是用户控件名称&gt; studentsWin.Visibility = Visibility.Visible;

     

成员MembersWin = new AjouterMembre(); //成员是用户控件名称&gt; MembersWin.Visibility = Visibility.Visible;

如果&#34;学生&#34;是用户控件名称(意味着您添加了x:Name =&#34;学生&#34;到XAML中的控件)然后您将能够使用该行在后面的代码中访问它:

Students.visibility = Visibility.Visible;

我将在下面探讨您的其余代码,希望它能为您提供帮助。如果您对C#和WPF不熟悉,我希望以下内容不会使您看起来过于复杂。

&#34;学生studentWin = new MembresList();&#34;编译? MembresList必须是Students类的子类,这将是一个奇怪的类层次结构。但即使该行已经编译,之后的行肯定不会编译。 &#34;学生&#34;必须是类的名称,但Visibility是UI对象的实例属性。如果Students是UserControl的子类,你可以做

Students myStudent = new Student(); //Assumes Students subclasses Usercontrol
myStudent.visibility = Visibility.Visible; //This compiles but is useless

上面的代码会编译,但是没用,因为新的myStudent对象没有被添加到表单的任何地方。它只是一个存在于定义它的方法范围内的对象。

依赖属性是一个有用的东西,但是在你对C#和WPF有一个很好的处理之前我不会担心它们。这些东西非常先进。

相关问题