Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个用户控件(登录)更改WPF用户控件的可见性_C#_Wpf_Xaml - Fatal编程技术网

C# 从另一个用户控件(登录)更改WPF用户控件的可见性

C# 从另一个用户控件(登录)更改WPF用户控件的可见性,c#,wpf,xaml,C#,Wpf,Xaml,我用WPF和C#(没有MVVM)创建了一个应用程序,我有多个用户控件 包含网格、窗体和其他内容。但最后我想添加一个登录页面,我开始构建它的方式是,默认情况下将xaml中的所有用户控件可见性设置为: Visibility="Collapsed" 为了让登录用户控件可见,在登录后以及在C#代码中,我想将其他用户控件的可见性更改为可见,并将登录页面设置为折叠 我尝试过类似的方法,但没有成功: Students studentsWin = new Students(); studentsW

我用WPF和C#(没有MVVM)创建了一个应用程序,我有多个用户控件 包含网格、窗体和其他内容。但最后我想添加一个登录页面,我开始构建它的方式是,默认情况下将xaml中的所有用户控件可见性设置为:

 Visibility="Collapsed"
为了让登录用户控件可见,在登录后以及在C#代码中,我想将其他用户控件的可见性更改为可见,并将登录页面设置为折叠

我尝试过类似的方法,但没有成功:

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

  Members MembersWin = new Members();
  MembersWin.Visibility = Visibility.Visible;
我在stackoverflow中读到了使用dependency 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, 任何帮助都将不胜感激

学生studentsWin=新成员列表()//Students是用户控件名>studentsWin.Visibility=Visibility.Visible


Members MembersWin=new ajournermembre()//Members是用户控件名>MembersWin.Visibility=Visibility.Visible

如果“Students”是用户控件名(意味着您在XAML中向控件添加了x:name=“Students”),那么您将能够在代码隐藏中通过以下行访问它:

Students.visibility = Visibility.Visible;
我将在下面探索您的其余代码,希望它能帮助您。如果你对C#和WPF还很陌生,我希望下面的内容不会让你觉得事情过于复杂而气馁

“学生studentsWin=newmembreslist();”是否编译?MembresList必须是Students类的子类,这将是一个奇怪的类层次结构。但即使那一行确实编译了,那之后的那一行肯定不会编译。“Students”必须是类的名称,但可见性是UI对象的实例属性。如果Students是UserControl的子类,那么您可以

Students myStudent = new Student(); //Assumes Students subclasses Usercontrol
myStudent.visibility = Visibility.Visible; //This compiles but is useless
上面的代码可以编译,但是没有用,因为新的myStudent对象没有添加到表单的任何地方。它只是一个在定义它的方法范围内的对象

依赖属性是一件很有用的事情,但我不会担心它们,除非你对C#和WPF有一个很好的总体把握。那东西很先进

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

    <Grid>
      <Grid x:Name="UC_Container">
           <!-- Rest of user controls go here -->
      </Grid>
    
      <uc:UserControl1 x:Name="LoginUC" Background="Aqua"/>            
    </Grid>
    
    您的登录ui将被隐藏,下面包含您的uc其余部分的网格将可见

  • 您正在考虑的方法是:在登录UC中需要一个类似ShowLoginUI的依赖属性。然后在用户成功登录后,只需将其设置为false,因为不再需要LoginUI
  • 然后在使用所有控件的主窗口中,将登录ui容器网格的可见性绑定到LoginUI的ShowLoginUI dep属性

    无需设置UC_容器的可见性,因为它将被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。 使用网格作为顶部容器,因为它允许它的子对象堆叠在彼此的顶部,隐藏下面的子对象。BooleantVisibilityConverter是您可以使用的内置转换器类

    <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>
    
    
    
  • 最好的方法是使用框架。框架将您的登录UI和其他UCs清晰地分开

    Members MembersWin=new ajournermembre();这只是一个输入错误:)你能解释一下第一种方法吗:我如何实现
    <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>