0

我的应用程序上有一个用户输入表单,其中包含大量的文本框和数据网格。有些客户不会每次都使用它们......所以我希望一旦用户点击按钮或复选框,它们就会动态出现。

我试过在网上寻求帮助,但没有运气。

提前感谢您的任何建议

4

2 回答 2

1

1) 第一个基本问题——你需要大量的文本框和数据网格吗?这听起来可能会使用户界面混乱。我总是首先尝试简化用户界面。

2) 控件是否必须采用固定布局?是否像打开和关闭控件的可见性一样简单?

3) 如果控件布局必须是动态的,您可以将控件“.Add(new Button(...))”动态添加到列表/网格中。我不确定我是否会推荐这种方法来进行一些简单的更改。

4) 是否有所有客户通用的控制措施?

5) 如果有公共控件,则考虑使用 UserControl 对它们进行分组,并使用 ContentPresenter 或其他控件将它们动态添加到表单中(执行此操作的确切方法可能取决于您是否使用 MVVM 架构)。您可以将 contentpresenter 绑定到作为 UserControl 的属性。

6) 最坏的情况是每个客户端的布局必须非常灵活,以至于您只需为每个客户端创建一个新的 UserControl。您绑定到的基础数据对象可以保持不变,但通过每个 UserControl 公开不同的方面。

您对 WPF 的体验如何?要真正有效地完成这类事情,您需要研究数据绑定、视图、内容呈现器、列表/网格、用户控件。

于 2013-03-08T07:40:23.917 回答
0

由于您刚刚开始使用 WPF,所以我想向您展示一些示例,这些示例可以帮助您了解触发器等其他内容,这可能会对您有所帮助..

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300"
        >
    <StackPanel>

        <ToggleButton x:Name="tgbtnTextBoxVisibility" Click="tgbtnTextBoxVisibility_Click" >
            <!-- Define the Style Trigger, to toggle the Text on the Toggle Button. If the ToggleButton is unchecked then display 'Hide TextBoxes'-->
            <!---Do not set the 'Content' property directly on the control, which overrides the 'Content' defined in Styles/Triggers, because of property precedence-->
            <ToggleButton.Style>
                <Style TargetType="ToggleButton">
                    <Setter Property="Content" Value="Show TextBoxes"/>
                    <Style.Triggers>
                        <Trigger Property="IsChecked"   Value="True" >
                            <Setter Property="Content" Value="Hide TextBoxes"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ToggleButton.Style>
        </ToggleButton>

        <!-- When the StackPanel below is shown, you can observe the 'Show TextBlocks' button automatically slides down-->
        <StackPanel x:Name="spTextBoxes" Visibility="Collapsed">
            <TextBox x:Name="txtName" Width="100" Height="30"/>
            <TextBox x:Name="txtCompany" Width="100" Height="30"/>
        </StackPanel>

        <ToggleButton x:Name="tgbtnTextBlockVisibility" Click="tgbtnTextBlockVisibility_Click">
            <ToggleButton.Style>
                <Style TargetType="ToggleButton">
                    <Setter Property="Content" Value="Show TextBlocks"/>
                    <Style.Triggers>
                        <Trigger Property="IsChecked"   Value="True" >
                            <Setter Property="Content" Value="Hide TextBlocks"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ToggleButton.Style>
        </ToggleButton>
        <StackPanel x:Name="spTextBlocks" Visibility="Collapsed">
            <!--'Text' property of TextBlock is directly bound to the corresponding TextBox's 'Text' properrty, which changes as you type in the text into source TextBox-->
            <TextBlock x:Name="tbkName" Text="{Binding ElementName=txtName,Path=Text}"  Width="100" Height="30"/>
            <TextBlock x:Name="tbkCompany" Text="{Binding ElementName=txtCompany,Path=Text}" Width="100" Height="30"/>
        </StackPanel>

    </StackPanel>
</Window>

在代码隐藏中,我正在设置相应堆栈面板的可见性。 注意:使用 ValueConverter 更改可见性可能更合适。

    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void tgbtnTextBoxVisibility_Click(object sender, RoutedEventArgs e)
        {
            ToggleButton tgbtnTextBoxes=sender as ToggleButton;

            if (tgbtnTextBoxes.IsChecked.HasValue && tgbtnTextBoxes.IsChecked.Value)
                spTextBoxes.Visibility = Visibility.Visible;
            else
                spTextBoxes.Visibility = Visibility.Collapsed; //Note: Visibility.Collapsed will resize the layout where as Visibility.Hidden will not.
        }

        private void tgbtnTextBlockVisibility_Click(object sender, RoutedEventArgs e)
        {
            ToggleButton tgbtnTextBlocks = sender as ToggleButton;

            if (tgbtnTextBlocks.IsChecked.HasValue && tgbtnTextBlocks.IsChecked.Value)
                spTextBlocks.Visibility = Visibility.Visible;
            else
                spTextBlocks.Visibility = Visibility.Collapsed; //Note: Visibility.Collapsed will resize the layout where as Visibility.Hidden will not.
        }
    }
于 2013-03-08T09:58:47.657 回答