如何在另一个类的splitview中更改堆栈面板的可见性

时间:2018-11-26 11:00:32

标签: c# wpf

我想将堆栈面板的可见性从“ visible.collaps”更改为“ visibility.visible”。但是我无法在它所在的主页上完成此操作。那是因为您需要登录到应用程序中,所以我想在Homepage.cs中进行操作,但是我该如何从那里更改stackpanel的值呢?我需要这样做,因为我的所有视图都加载在您可以在下面的代码中看到的框架中。

在下面找到拆分视图的代码

<SplitView x:Name="mySplitView" IsPaneOpen="False" DisplayMode="CompactInline">
    <SplitView.Pane>
        <StackPanel Background="Gray" Tapped="StackPanel_Tapped">
            <Button FontFamily="Segoe MDL2 Assets" Content="&#xE700;" Click="Menu_Button_Click" Width="50" Height="50"  />
            <StackPanel Orientation="Horizontal" Tapped="Home_StackPanel_Tapped">
                <Button FontFamily="Segoe MDL2 Assets" Content="&#xE80F;" Width="50" Height="50" />
                <TextBlock Text="Home" FontSize="18" VerticalAlignment="Center" Margin="5,0,0,0"/>
            </StackPanel>
            <Line X1="0" X2="0" Y1="5" Y2="5" StrokeThickness="1.5" Stretch="UniformToFill" Height="10" />
            <StackPanel Orientation="Horizontal" Tapped="Company_StackPanel_Tapped" Visibility="Collapsed">
                <Button FontFamily="Segoe MDL2 Assets" Content="&#xE731;" Width="50" Height="50"/>
                <TextBlock Text="Bedrijven" FontSize="18" VerticalAlignment="Center" Margin="5,0,0,0"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Tapped="Event_StackPanel_Tapped" Visibility="Collapsed">
                <Button FontFamily="Segoe MDL2 Assets" Content="&#xE787;" Width="50" Height="50"/>
                <TextBlock Text="Evenementen" FontSize="18" VerticalAlignment="Center" Margin="5,0,0,0"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Tapped="Promo_StackPanel_Tapped" Visibility="Collapsed">
                <Button FontFamily="Segoe MDL2 Assets" Content="&#xE8EC;" Width="50" Height="50" />
                <TextBlock Text="Promoties" FontSize="18" VerticalAlignment="Center" Margin="5,0,0,0"/>
            </StackPanel>
            <Line X1="0" X2="0" Y1="5" Y2="5" StrokeThickness="1.5" Stretch="UniformToFill" Height="10"/>
            <StackPanel Orientation="Horizontal" Tapped="Login_StackPanel_Tapped">
                <Button FontFamily="Segoe MDL2 Assets" Content="&#xE77B;" Width="50" Height="50" />
                <TextBlock Text="Inloggen" FontSize="18" VerticalAlignment="Center" Margin="5,0,0,0"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Tapped="Registreer_StackPanel_Tapped" >
                <Button FontFamily="Segoe MDL2 Assets" Content="&#xE8FA;" Width="50" Height="50" />
                <TextBlock Text="Registreren" FontSize="18" VerticalAlignment="Center" Margin="5,0,0,0"/>
            </StackPanel>
            <StackPanel Orientation="Horizontal" x:Name="profielwijzigen" Tapped="Profiel_Wijzigen_StackPanel_Tapped" Visibility="Collapsed">
                <Button FontFamily="Segoe MDL2 Assets" Content="&#xE713;" Width="50" Height="50" />
                <TextBlock Text="Profiel Wijzigen" FontSize="18" VerticalAlignment="Center" Margin="5,0,0,0"/>
            </StackPanel>
        </StackPanel>
    </SplitView.Pane>
    <SplitView.Content>
        <Frame Name="mainFrame">
            Wait for redirect
        </Frame>
    </SplitView.Content>
</SplitView>

2 个答案:

答案 0 :(得分:1)

如果您开始使用MVVM,这些任务将非常容易。下面是一个示例(作为一种介绍)。

对于每个不同的视图(UserControl,数据模板,窗口等),您必须创建一个视图模型(VM)。视图模型可以具有复杂的关系。让我们创建一个:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged([CallerMemberName] string property = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));


    bool _show;
    public bool Show
    {
        get { return _show; }
        set
        {
            _show = value;
            OnPropertyChanged();
        }
    }
}

通常会有更多属性,它们将专门用于处理特定视图(例如,主窗口或某些用户控件中的所有内容),但暂时让它保持简单。

下一步,让我们重新创建您的问题:我们将提供StackPanelFrame。框架部分将使用CheckBox通过绑定到bool属性来更改可见性。并且StackPanel将具有一些文本(以查看其是否有效)并将可见性绑定到相同的bool属性。

<Window ... >
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="converter"/>
        <local:ViewModel x:Key="vm"/>
    </Window.Resources>
    <StackPanel>
        <StackPanel Visibility="{Binding Show, Converter={StaticResource converter}}" DataContext="{StaticResource vm}">
            <TextBlock Text="Some test"/>
        </StackPanel>
        <Frame>
            <Frame.Content>
                <CheckBox IsChecked="{Binding Show}" DataContext="{StaticResource vm}"/>
            </Frame.Content>
        </Frame>
    </StackPanel>
</Window>

MVVM的整体思想是利用DataContext继承:任何嵌套框架元素都将从其父级获取上下文。但是在此示例中,直接为每个设置。

视图模型的实例是在Windows资源中创建的。在应用程序级别上可能需要一个,甚至可能需要传递它(不确定框架内容的外观)。

转换器用于将bool转换为Visibility

如果运行它,应该会看到类似以下内容的

答案 1 :(得分:-2)

您可以使用一些事件

在用于登录的子组件(例如类为LoginControl)中,您声明事件:

public event EventHandler LoggedIn = delegate {};

您在主要组件中注册处理程序:

loginControl.LoggedIn += (s, e) => {
    Company_StackPanel.Visibility = Visibility.Visible;
    Event_StackPanel.Visibility = Visibility.Visible;
    Promo_StackPanel.Visibility = Visibility.Visible;
};

在用户登录后,在您的LoginControl中引发事件:

this.LoggedIn(this, EventArgs.Empty);