Как изменить видимость из стековой панели в splitview из другого класса - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу изменить видимость с панели стека с видимости. Свернуть на видимость. Видимый.Но я не могу сделать это на главной странице, где он находится.Это потому, что вам нужно войти в приложение, поэтому я хочу сделать это в Homepage.cs, но как я могу изменить значение стековой панели оттуда?Мне нужно сделать это таким образом, потому что все мои представления загружаются во фрейм, который вы можете увидеть ниже в коде.

Ниже вы найдете код разделенного вида

<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 голосов
/ 26 ноября 2018

Такие задачи очень просты, если вы начинаете использовать MVVM.Ниже приведен пример (как своего рода введение).

Для каждого отдельного представления (UserControl, шаблона данных, окна и т. Д.) Необходимо создать модель представления (ВМ).Представление моделей может иметь сложные отношения.Давайте создадим один:

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();
        }
    }
}

Как правило, будет больше свойств, и они будут выделены для обработки определенного представления (например, всего в главном окне или определенного пользовательского элемента управления), но на данный момент давайте будем простыми.

Далее давайте воссоздадим вашу проблему: у нас будет StackPanel и Frame.Часть кадра будет иметь 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.

Есливы запускаете его, вы должны увидеть что-то вроде:

0 голосов
/ 26 ноября 2018

Вы можете использовать некоторые события .

В подкомпоненте, используемом для входа в систему (скажем, класс 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...