You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需code behind:在XAML中绑定集合对象到按钮并实现问卷逐题显示

纯XAML实现问卷逐题显示方案

当然可以不用Code Behind实现这种逐题显示的效果!我给你分享一个基于WPF内置功能的纯XAML方案,完全不需要写后端代码就能完成需求:

核心思路

用VisualStateManager定义不同问题的显示状态,每个状态对应一个问题面板的可见性和切换按钮的文字;再配合隐藏的辅助控件和EventTrigger,实现按钮点击时的状态切换逻辑。

完整XAML代码示例

<Window x:Class="QuestionnaireApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="问卷应用" Height="450" Width="800">
    <Grid>
        <!-- 定义问题显示状态组 -->
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="QuestionStates">
                <!-- 第一题状态 -->
                <VisualState x:Name="Question1">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question1Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question2Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question3Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NextButton" Storyboard.TargetProperty="Content">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="进入第二题"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>

                <!-- 第二题状态 -->
                <VisualState x:Name="Question2">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question1Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question2Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question3Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NextButton" Storyboard.TargetProperty="Content">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="进入第三题"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>

                <!-- 第三题状态 -->
                <VisualState x:Name="Question3">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question1Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question2Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Question3Panel" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="NextButton" Storyboard.TargetProperty="Content">
                            <DiscreteObjectKeyFrame KeyTime="0" Value="完成"/>
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

        <!-- 第一题面板 -->
        <StackPanel x:Name="Question1Panel" Visibility="Visible">
            <TextBlock FontSize="20" Margin="10">第一题:你最喜欢的编程语言是?</TextBlock>
            <RadioButton Margin="10" Content="C#"/>
            <RadioButton Margin="10" Content="Java"/>
            <RadioButton Margin="10" Content="Python"/>
        </StackPanel>

        <!-- 第二题面板 -->
        <StackPanel x:Name="Question2Panel" Visibility="Collapsed">
            <TextBlock FontSize="20" Margin="10">第二题:你每天编程时长是?</TextBlock>
            <RadioButton Margin="10" Content="1-3小时"/>
            <RadioButton Margin="10" Content="3-6小时"/>
            <RadioButton Margin="10" Content="6小时以上"/>
        </StackPanel>

        <!-- 第三题面板 -->
        <StackPanel x:Name="Question3Panel" Visibility="Collapsed">
            <TextBlock FontSize="20" Margin="10">第三题:你使用WPF多久了?</TextBlock>
            <RadioButton Margin="10" Content="不到1年"/>
            <RadioButton Margin="10" Content="1-3年"/>
            <RadioButton Margin="10" Content="3年以上"/>
        </StackPanel>

        <!-- 切换按钮 -->
        <Button x:Name="NextButton" Content="进入第二题" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20" Padding="15,8">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard>
                        <Storyboard>
                            <BooleanAnimationUsingKeyFrames Storyboard.TargetName="StateSwitcher" Storyboard.TargetProperty="IsChecked">
                                <DiscreteBooleanKeyFrame KeyTime="0" Value="True"/>
                            </BooleanAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>

        <!-- 隐藏的状态切换辅助控件 -->
        <ToggleButton x:Name="StateSwitcher" Visibility="Collapsed">
            <ToggleButton.Triggers>
                <!-- 从第一题切换到第二题 -->
                <EventTrigger RoutedEvent="ToggleButton.Checked">
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition SourceName="Question1Panel" Property="Visibility" Value="Visible"/>
                        </MultiTrigger.Conditions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetName="StateSwitcher" Storyboard.TargetProperty="IsChecked">
                                    <DiscreteBooleanKeyFrame KeyTime="0" Value="False"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                        <GoToStateAction StateName="Question2"/>
                    </MultiTrigger>
                </EventTrigger>

                <!-- 从第二题切换到第三题 -->
                <EventTrigger RoutedEvent="ToggleButton.Checked">
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition SourceName="Question2Panel" Property="Visibility" Value="Visible"/>
                        </MultiTrigger.Conditions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetName="StateSwitcher" Storyboard.TargetProperty="IsChecked">
                                    <DiscreteBooleanKeyFrame KeyTime="0" Value="False"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                        <GoToStateAction StateName="Question3"/>
                    </MultiTrigger>
                </EventTrigger>

                <!-- 完成问卷后的逻辑(可自定义) -->
                <EventTrigger RoutedEvent="ToggleButton.Checked">
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition SourceName="Question3Panel" Property="Visibility" Value="Visible"/>
                        </MultiTrigger.Conditions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetName="StateSwitcher" Storyboard.TargetProperty="IsChecked">
                                    <DiscreteBooleanKeyFrame KeyTime="0" Value="False"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                        <!-- 这里可以添加显示感谢信息等逻辑 -->
                    </MultiTrigger>
                </EventTrigger>
            </ToggleButton.Triggers>
        </ToggleButton>
    </Grid>
</Window>

关键部分说明

  1. VisualStateManager:定义了三个状态,分别控制对应问题面板的显示/隐藏,以及切换按钮的文字内容,确保每个状态下只有当前问题可见。
  2. 切换按钮与辅助ToggleButton:主按钮点击时触发隐藏的ToggleButton的Checked事件,这个辅助控件会根据当前显示的问题面板,自动切换到下一个状态,然后重置自身状态准备下一次点击。
  3. 扩展性:如果需要添加更多问题,只需要新增对应的VisualState和问题面板,再给辅助ToggleButton添加对应的切换逻辑即可,非常灵活。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:20:10