WPF隐藏顶面板布局

WPF隐藏顶面板布局,wpf,xaml,Wpf,Xaml,我是WPF的新手,我很难理解所有面板和网格,以及它们如何协同工作来构建所需的布局。我试图构建一个窗口,其中顶部部分(面板)有一组控件,面板有一个隐藏按钮。当用户单击“隐藏”时,顶部向上滑动,底部展开以取代其位置。我可以使用什么样的面板组合来生成这种类型的布局?有没有一个我还没有找到的例子 您好,如果您想使用MVVM解决此问题,请尝试以下方法 xaml。这里我有一个有三行的网格 视图模型 public class ViewModel:INotifyPropertyChanged {

我是WPF的新手,我很难理解所有面板和网格,以及它们如何协同工作来构建所需的布局。我试图构建一个窗口,其中顶部部分(面板)有一组控件,面板有一个隐藏按钮。当用户单击“隐藏”时,顶部向上滑动,底部展开以取代其位置。我可以使用什么样的面板组合来生成这种类型的布局?有没有一个我还没有找到的例子


您好,如果您想使用MVVM解决此问题,请尝试以下方法

xaml。这里我有一个有三行的网格

视图模型

    public class ViewModel:INotifyPropertyChanged
{
    public ViewModel()
    {
        SetInitialState();
    }
    void SetInitialState()
    {
        buttonState = ButtonState.Shown;
        GridVisibility = Visibility.Visible;
        ButtonText = "Hide";
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,
                new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }

    private string buttonText;
    public  string ButtonText
    {
        get
        {
            return buttonText;
        }
        set
        {
            buttonText = value;
            OnPropertyChanged("ButtonText");
        }
    }

    private Visibility gridVisibility;
    public  Visibility GridVisibility
    {
        get
        {
            return gridVisibility;
        }
        set
        {
            gridVisibility = value;
            OnPropertyChanged("GridVisibility");
        }
    }

    private MyCommand showHideCommand;
    public MyCommand ShowHidecommand
    {
        get { return showHideCommand ?? (showHideCommand = new MyCommand((o) => OnShowHideCommand(o), () => true)); }
    }

    public void OnShowHideCommand(object obj)
    {
        if (buttonState == ButtonState.Shown)
        {
            buttonState = ButtonState.Hidden;
            GridVisibility = Visibility.Collapsed;
            ButtonText = "Show";
        }
        else
        {
            buttonState = ButtonState.Shown;
            GridVisibility = Visibility.Visible;
            ButtonText = "Hide";
        }

    }

    ButtonState buttonState;
    enum ButtonState
    { 
        Shown,
        Hidden
    }
}
MyCommand.cs


您好,如果您想使用MVVM解决此问题,请尝试以下方法

xaml。这里我有一个有三行的网格

视图模型

    public class ViewModel:INotifyPropertyChanged
{
    public ViewModel()
    {
        SetInitialState();
    }
    void SetInitialState()
    {
        buttonState = ButtonState.Shown;
        GridVisibility = Visibility.Visible;
        ButtonText = "Hide";
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,
                new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }

    private string buttonText;
    public  string ButtonText
    {
        get
        {
            return buttonText;
        }
        set
        {
            buttonText = value;
            OnPropertyChanged("ButtonText");
        }
    }

    private Visibility gridVisibility;
    public  Visibility GridVisibility
    {
        get
        {
            return gridVisibility;
        }
        set
        {
            gridVisibility = value;
            OnPropertyChanged("GridVisibility");
        }
    }

    private MyCommand showHideCommand;
    public MyCommand ShowHidecommand
    {
        get { return showHideCommand ?? (showHideCommand = new MyCommand((o) => OnShowHideCommand(o), () => true)); }
    }

    public void OnShowHideCommand(object obj)
    {
        if (buttonState == ButtonState.Shown)
        {
            buttonState = ButtonState.Hidden;
            GridVisibility = Visibility.Collapsed;
            ButtonText = "Show";
        }
        else
        {
            buttonState = ButtonState.Shown;
            GridVisibility = Visibility.Visible;
            ButtonText = "Hide";
        }

    }

    ButtonState buttonState;
    enum ButtonState
    { 
        Shown,
        Hidden
    }
}
MyCommand.cs


令人惊叹的。谢谢@ethicalogics我会尝试一下的!谢谢@ethicalogics,它非常有效。如果我能接受两次答案,我会的!感谢您介绍这两种方法:)太棒了。谢谢@ethicalogics我会尝试一下的!谢谢@ethicalogics,它非常有效。如果我能接受两次答案,我会的!感谢您介绍这两种方法:)
    public class ViewModel:INotifyPropertyChanged
{
    public ViewModel()
    {
        SetInitialState();
    }
    void SetInitialState()
    {
        buttonState = ButtonState.Shown;
        GridVisibility = Visibility.Visible;
        ButtonText = "Hide";
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this,
                new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }

    private string buttonText;
    public  string ButtonText
    {
        get
        {
            return buttonText;
        }
        set
        {
            buttonText = value;
            OnPropertyChanged("ButtonText");
        }
    }

    private Visibility gridVisibility;
    public  Visibility GridVisibility
    {
        get
        {
            return gridVisibility;
        }
        set
        {
            gridVisibility = value;
            OnPropertyChanged("GridVisibility");
        }
    }

    private MyCommand showHideCommand;
    public MyCommand ShowHidecommand
    {
        get { return showHideCommand ?? (showHideCommand = new MyCommand((o) => OnShowHideCommand(o), () => true)); }
    }

    public void OnShowHideCommand(object obj)
    {
        if (buttonState == ButtonState.Shown)
        {
            buttonState = ButtonState.Hidden;
            GridVisibility = Visibility.Collapsed;
            ButtonText = "Show";
        }
        else
        {
            buttonState = ButtonState.Shown;
            GridVisibility = Visibility.Visible;
            ButtonText = "Hide";
        }

    }

    ButtonState buttonState;
    enum ButtonState
    { 
        Shown,
        Hidden
    }
}
    public class MyCommand : ICommand
{
    Action<object> executeAction;
    Func<bool> canExecute;

    public MyCommand(Action<object> executeAction, Func<bool> canExecute)
    {
        this.executeAction = executeAction;
        this.canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        if (canExecute != null)
            return canExecute();
        else
            return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        if (executeAction != null)
            executeAction(parameter);
    }
}
    <Grid x:Name="myGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid x:Name="showHideGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="100"/>
        </Grid.RowDefinitions>
        <TextBlock Text="here will be some controls" FontSize="20"/>
    </Grid>
    <Button Content="Show" Grid.Row="1" Click="Button_Click_1"/>
    <DataGrid Grid.Row="2"></DataGrid>
</Grid>
        private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        var button = sender as Button;
        if (button != null)
        {
            if (button.Content == "Show")
            {
                button.Content = "Hide";
                showHideGrid.Visibility = Visibility.Visible;
            }
            else
            {
                button.Content = "Show";
                showHideGrid.Visibility = Visibility.Collapsed;
            }
        }
    }