C#无法将父控件的可见性设置为“可见”,而子控件的可见性设置为“崩溃”

时间:2020-05-07 20:36:18

标签: c# wpf xaml

编辑

我正在调整问题以使其更加清楚。

我正在处理的应用程序具有登录屏幕(称为MainWindow)和主应用程序(称为HomeWindow)。

一旦用户输入其凭据,就会触发点击事件(为简化起见,我减少了代码)

private void BtnHello_Click(object sender, RoutedEventArgs e)
{
   HomeWindow homeWindow = new HomeWindow();
   MainWindow mainWindow = new MainWindow();
   HRLevel1UserControl hRLevel1UserControl = new HRLevel1UserControl();
   StudentsLevel1UserControl studentsLevel1UserControl = new StudentsLevel1UserControl();

    homeWindow.ItemHR.Visibility = Visibility.Collapsed;
    homeWindow.ItemStudents.Visibility = Visibility.Collapsed;
    homeWindow.ItemClass.Visibility = Visibility.Collapsed;
    homeWindow.ItemFinances.Visibility = Visibility.Collapsed;
    homeWindow.ItemSchool.Visibility = Visibility.Collapsed;
    homeWindow.ItemReports.Visibility = Visibility.Collapsed;

    foreach (UserCategory userCategory in new CheckConnection().CheckPrivilege(LoggedInData.LoggedInUserId, LoggedInData.LoggedInstitutionId))
    {
      if (userCategory.Role == TeacherRole)
      {                                                
       homeWindow.ItemStudents.Visibility = Visibility.Visible;                                                
       studentsLevel1UserControl.StudentManageBtn.Visibility = Visibility.Collapsed;                                                
       studentsLevel1UserControl.StudentReportBtn.Visibility = Visibility.Collapsed;                                                
       homeWindow.MenuBarSettings.Visibility = Visibility.Collapsed;
       }
       else
       {
          MessageBox.Show("-", MessageBoxButton.OK, MessageBoxImage.Stop);
          return;
       }
    }
   this.Close();
   homeWindow.Show();
}

homeWindow是主应用程序窗口,它是根据followinf XAML创建的:

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid Grid.Row="2">
            <Frame BorderBrush="DarkGray" BorderThickness="2"/>
            <Grid Name="MainGrid" Background="White" Margin="140 5 5 5" HorizontalAlignment="Stretch"/>
            <Grid Margin="4 4 0 5" Width="132" HorizontalAlignment="Left">
                <Grid.Background>
                    <LinearGradientBrush EndPoint="0.5,2.5" StartPoint="1,0" MappingMode="RelativeToBoundingBox" SpreadMethod="Pad" Opacity="0.3">
                        <GradientStop Color="Black" Offset="1"/>
                        <GradientStop Color="White" Offset="0"/>
                    </LinearGradientBrush>
                </Grid.Background>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="8*"/>
                </Grid.RowDefinitions>
                <Image Source="{DynamicResource Logo}" ToolTip="Sire Systems" HorizontalAlignment="Left"/>
                <ListView x:Name="ListViewMain" Grid.Row="1" Background="Transparent" SelectionMode="Single" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionChanged="ListViewMain_SelectionChanged">
                    <ListView.BorderBrush>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="Black"/>
                            <GradientStop Color="White" Offset="1"/>
                        </LinearGradientBrush>
                    </ListView.BorderBrush>
                    <ListViewItem BorderThickness="0" Background="Transparent" Foreground="Transparent" Width="128" x:Name="ItemAccueil" HorizontalAlignment="Left" ToolTip="Accueil">
                        <StackPanel Orientation="Horizontal">
                            <Image Margin="5" Source="{DynamicResource Dashboard}"/>
                            <TextBlock Text="Accueil" VerticalAlignment="Center" FontSize="14" FontWeight="DemiBold" Foreground="#FF606060"/>
                        </StackPanel>
                    </ListViewItem>
                    <ListViewItem BorderThickness="0" Background="Transparent" Foreground="Transparent" Width="128" x:Name="ItemHR" HorizontalAlignment="Left" ToolTip="Ressources Humaines">
                        <StackPanel Orientation="Horizontal">
                            <Image Margin="5" Source="{DynamicResource HR}"/>
                            <TextBlock Text="RH" VerticalAlignment="Center" FontSize="14" FontWeight="DemiBold" Foreground="#FF606060"/>
                        </StackPanel>
                    </ListViewItem>
                    <ListViewItem BorderThickness="0" Background="Transparent" Foreground="Transparent" Width="128" x:Name="ItemStudents" HorizontalAlignment="Left" ToolTip="Gestion Etudiants">
                        <StackPanel Orientation="Horizontal">
                            <Image Margin="5" Source="{DynamicResource Students}"/>
                            <TextBlock Text="Etudiants" VerticalAlignment="Center" FontSize="14" FontWeight="DemiBold" Foreground="#FF606060"/>
                        </StackPanel>
                    </ListViewItem>
                    <ListViewItem BorderThickness="0" Background="Transparent" Foreground="Transparent" Width="128" x:Name="ItemClass" HorizontalAlignment="Left" ToolTip="Gestion Classes">
                        <StackPanel Orientation="Horizontal">
                            <Image Margin="5" Source="{DynamicResource Classes}"/>
                            <TextBlock Text="Classes" VerticalAlignment="Center" FontSize="14" FontWeight="DemiBold" Foreground="#FF606060"/>
                        </StackPanel>
                    </ListViewItem>
                    <ListViewItem BorderThickness="0" Background="Transparent" Foreground="Transparent" Width="128" x:Name="ItemFinances" HorizontalAlignment="Left" ToolTip="Gestion Finances">
                        <StackPanel Orientation="Horizontal">
                            <Image Margin="5" Source="{DynamicResource Finances}"/>
                            <TextBlock Text="Finances" VerticalAlignment="Center" FontSize="14" FontWeight="DemiBold" Foreground="#FF606060"/>
                        </StackPanel>
                    </ListViewItem>
                    <ListViewItem BorderThickness="0" Background="Transparent" Foreground="Transparent" Width="128" x:Name="ItemSchool" HorizontalAlignment="Left" ToolTip="Gestion au Quotidien">
                        <StackPanel Orientation="Horizontal">
                            <Image Margin="5" Source="{DynamicResource School}"/>
                            <TextBlock Text="Ecole" VerticalAlignment="Center" FontSize="14" FontWeight="DemiBold" Foreground="#FF606060"/>
                        </StackPanel>
                    </ListViewItem>
                    <ListViewItem BorderThickness="0" Background="Transparent" Foreground="Transparent" Width="128" x:Name="ItemReports" HorizontalAlignment="Left" ToolTip="Rapports Globaux">
                        <StackPanel Orientation="Horizontal">
                            <Image Margin="5" Source="{DynamicResource Reports}"/>
                            <TextBlock Text="Rapports" VerticalAlignment="Center" FontSize="14" FontWeight="DemiBold" Foreground="#FF606060"/>
                        </StackPanel>
                    </ListViewItem>
                </ListView>
            </Grid>                        
        </Grid>        
    </Grid>

每个ListViewItem根据以下代码在MainGrid中加载用户控件:

private void ListViewMain_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            UserControl usc = null;
            //MainGrid.Children.Clear();

            try
            {
                switch (((ListViewItem)((ListView)sender).SelectedItem).Name)
                {
                    case "ItemAccueil":
                        usc = new HomeUserControl();
                        MainGrid.Children.Add(usc);
                        break;
                    case "ItemHR":
                        usc = new UserControls.Home.HRLevel1UserControl() { VerticalAlignment = VerticalAlignment.Stretch };
                        MainGrid.Children.Add(usc);
                        break;
                    case "ItemStudents":
                        usc = new UserControls.Students.StudentsLevel1UserControl() { VerticalAlignment = VerticalAlignment.Stretch };
                        MainGrid.Children.Add(usc);
                        break;
                    case "ItemClass":
                        usc = new UserControls.Classes.ClassLevel1UserControl() { VerticalAlignment = VerticalAlignment.Stretch };
                        MainGrid.Children.Add(usc);
                        break;
                    case "ItemFinances":
                        usc = new UserControls.Finances.FinancesLevel1UserControl() { VerticalAlignment = VerticalAlignment.Stretch };
                        MainGrid.Children.Add(usc);
                        break;
                    case "ItemSchool":
                        usc = new UserControls.School.SchoolLevel1UserControl() { VerticalAlignment = VerticalAlignment.Stretch };
                        MainGrid.Children.Add(usc);
                        break;
                    case "ItemReports":
                        usc = new UserControls.Reports.ReportsLevel1UserControl() { VerticalAlignment = VerticalAlignment.Stretch };
                        MainGrid.Children.Add(usc);
                        break;
                    default:
                        usc = new HomeUserControl();
                        MainGrid.Children.Add(usc);
                        break;
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
                return;
            }
        }

已加载的UserControl之一是学生usc,称为StudentsLevel1UserControl(请参见部分代码:case "ItemStudents")。这是该用户控件的XAML:

<Grid Style="{StaticResource UpperGridStyle}">
        <StackPanel Style="{StaticResource UscMenuBarStyle}">
            <StackPanel.Resources>
                <Style x:Key="MenuButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
                    <Setter Property="Background" Value="{x:Null}"/>
                    <Setter Property="BorderBrush" Value="{x:Null}"/>
                    <Setter Property="BorderThickness" Value="0"/>
                    <Setter Property="TextBlock.FontWeight" Value="DemiBold"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource Self}}" Value="True">
                            <Setter Property="Background" Value="LightBlue"/>
                            <Setter Property="BorderBrush" Value="#FF005C8B"/>
                            <Setter Property="BorderThickness" Value="1"/>
                            <Setter Property="TextBlock.FontWeight" Value="Bold"/>
                            <Setter Property="TextBlock.Foreground" Value="#FF3284CB"/>
                            <Setter Property="TextBlock.FontSize" Value="12.5"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Resources>
            <RadioButton Uid="0" x:Name="StudentManageBtn" Width="120" Content="Gestion Etudiants" Height="Auto" Style="{StaticResource MenuButtonStyle}" Click="Button_Click"/>
            <RadioButton Uid="1" x:Name="StudentRatingsBtn" Width="130" Content="Evaluations" Height="Auto" Style="{StaticResource MenuButtonStyle}" Click="Button_Click"/>
            <RadioButton Uid="2" x:Name="StudentPassingBtn" Width="120" Content="Passage de Classe" Height="Auto" Style="{StaticResource MenuButtonStyle}" Click="Button_Click"/>
            <RadioButton Uid="3" x:Name="StudentReportBtn" Width="120" Content="Rapports Etudiants" Height="Auto" Style="{StaticResource MenuButtonStyle}" Click="Button_Click"/>            
        </StackPanel>
        <Grid x:Name="StudentsMain" Margin="5 55 5 5" VerticalAlignment="Stretch"/>
    </Grid>

如您所见,此用户控件包含四个RadioButtons,而我要实现的目标是将Visibility的{​​{1}}和StudentManageBtn设置为StudentReportBtn基于登录的用户是否是老师。到目前为止,我使用的方法(在COllapsed按钮中)无效。

为完整起见,这是用户控件的代码

BtnHello_Click

1 个答案:

答案 0 :(得分:0)

我建议在相关的DataTrigger中使用Style

要使其正常运行,请确保UserCategoryMainWindow的公共属性。

以下示例为RadioButton定义了两种样式:现有样式MenuButtonStyle,该样式适用于每个不受RadioButton约束的Visibility
并且基于现有的MenuButtonStyle,新的MenuButtonTeacherVisibiltyStyle。应用于相关按钮后,如果用户角色为TeacherRole,它将折叠它们:

MainWindow.xaml.cs

private void BtnHello_Click(object sender, RoutedEventArgs e)
{
  HomeWindow homeWindow = new HomeWindow() {Role = this.UserCategory.Role};

  this.Close();
  homeWindow.Show();
}

StudentsLevel1UserControl.xaml

<UserControl>
  <UserControl.Resources>
    <Style x:Key="MenuButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
      <Setter Property="Background" Value="{x:Null}"/>
      <Setter Property="BorderBrush" Value="{x:Null}"/>
      <Setter Property="BorderThickness" Value="0"/>
      <Setter Property="TextBlock.FontWeight" Value="DemiBold"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource Self}}" Value="True">
          <Setter Property="Background" Value="LightBlue"/>
          <Setter Property="BorderBrush" Value="#FF005C8B"/>
          <Setter Property="BorderThickness" Value="1"/>
          <Setter Property="TextBlock.FontWeight" Value="Bold"/>
          <Setter Property="TextBlock.Foreground" Value="#FF3284CB"/>
          <Setter Property="TextBlock.FontSize" Value="12.5"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>

    <Style x:Key="MenuButtonTeacherVisibiltyStyle" 
           TargetType="RadioButton" 
           BasedOn="{StaticResource MenuButtonStyle}">
      <Setter Property="Visibility" Value="Visible"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=HomeWindow}, Path=Role}" Value="TeacherRole">
          <Setter Property="Visibility" Value="Collapsed"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </UserControl.Resources>

  <StackPanel>
    <RadioButton x:Name="StudentManageBtn" Style="{StaticResource MenuButtonTeacherVisibiltyStyle}" Click="Button_Click"/>
    <RadioButton x:Name="StudentRatingsBtn" tyle="{StaticResource MenuButtonStyle}" Click="Button_Click"/>
    <RadioButton x:Name="StudentPassingBtn" Style="{StaticResource MenuButtonStyle}" Click="Button_Click"/>
    <RadioButton x:Name="StudentReportBtn" Style="{StaticResource MenuButtonTeacherVisibiltyStyle}" Click="Button_Click"/>            
  </StackPanel>
</UserControl>

备注
您必须调整/插入XAML名称空间以使其进行编译。