我使用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, 任何帮助将不胜感激。
答案 0 :(得分:1)
简单的方法。使用以下布局
<Grid>
<Grid x:Name="UC_Container">
<!-- Rest of user controls go here -->
</Grid>
<uc:UserControl1 x:Name="LoginUC" Background="Aqua"/>
</Grid>
隐藏LogiUI本身就像SignIn按钮:点击,如
this.Visibility = Visibility.Collapsed
您的login-ui将被隐藏,位于下方的网格将包含您的其余部分。
然后在您使用所有控件的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 :(得分: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有一个很好的处理之前我不会担心它们。这些东西非常先进。