How to bind click of a button to change the content of a panel (Grid) using XAML

前端 未结 1 1935
离开以前
离开以前 2021-01-07 02:05

I am creating a UI of a WPF Application, and while working on the implementation of the software\'s features, i didn\'t have much experience with creating the UI.

No

相关标签:
1条回答
  • 2021-01-07 02:47

    I think the XAML-only solution you choose will depend on your specific requirements. In the examples below, I am assuming that XAML-only means you are looking for a solution that does not involve binding to properties in your ViewModel.

    Approach #1:

    If you decide to use a single ToggleButton to show and hide your panel, then this can be done quite easily using Triggers:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <ContentControl>
            <ContentControl.Template>
                <ControlTemplate>
                    <StackPanel>
                        <Grid x:Name="myGrid" Background="Beige" Height="100">
                            <TextBlock Text="Content Placeholder" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
                        </Grid>
                        <ToggleButton x:Name="toggleButton" Content="Show\Hide Panel" IsChecked="True"/>
                    </StackPanel>
                    <ControlTemplate.Triggers>
                        <Trigger SourceName="toggleButton" Property="IsChecked" Value="True">
                            <Setter TargetName="myGrid" Property="Visibility" Value="Visible" />
                        </Trigger>
                        <Trigger SourceName="toggleButton" Property="IsChecked" Value="False">
                            <Setter TargetName="myGrid" Property="Visibility" Value="Hidden" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </ContentControl.Template>
        </ContentControl>
    </Window>
    

    Approach #2:

    If instead you require two buttons (one for showing the panel, one for hiding the panel), then perhaps you could use an EventTrigger instead. This solution is more heavy handed since an EventTrigger does not use Setter's but instead its action is required to be a Storyboard. To emulate the setting of a property like Visibility you can use ObjectAnimationUsingKeyFrames in your Storyboard:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel>
            <Grid x:Name="myGrid" Background="Beige" Height="100">
                <TextBlock Text="Content Placeholder" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
            </Grid>
            <Button x:Name="showPanelButton" Content="Show Panel" />
            <Button x:Name="hidePanelButton" Content="Hide Panel" />
            <StackPanel.Triggers>
                <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonUp" SourceName="showPanelButton">
                    <BeginStoryboard>
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="myGrid" Storyboard.TargetProperty="(UIElement.Visibility)">
                                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonUp" SourceName="hidePanelButton">
                    <BeginStoryboard>
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="myGrid" Storyboard.TargetProperty="(UIElement.Visibility)">
                                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Hidden}"/>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </StackPanel.Triggers>
        </StackPanel>
    </Window>
    

    Hope this helps!

    0 讨论(0)
提交回复
热议问题