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