我的应用程序上有一个用户输入表单,其中包含大量的文本框和数据网格。有些客户不会每次都使用它们......所以我希望一旦用户点击按钮或复选框,它们就会动态出现。
我试过在网上寻求帮助,但没有运气。
提前感谢您的任何建议
我的应用程序上有一个用户输入表单,其中包含大量的文本框和数据网格。有些客户不会每次都使用它们......所以我希望一旦用户点击按钮或复选框,它们就会动态出现。
我试过在网上寻求帮助,但没有运气。
提前感谢您的任何建议
1) 第一个基本问题——你需要大量的文本框和数据网格吗?这听起来可能会使用户界面混乱。我总是首先尝试简化用户界面。
2) 控件是否必须采用固定布局?是否像打开和关闭控件的可见性一样简单?
3) 如果控件布局必须是动态的,您可以将控件“.Add(new Button(...))”动态添加到列表/网格中。我不确定我是否会推荐这种方法来进行一些简单的更改。
4) 是否有所有客户通用的控制措施?
5) 如果有公共控件,则考虑使用 UserControl 对它们进行分组,并使用 ContentPresenter 或其他控件将它们动态添加到表单中(执行此操作的确切方法可能取决于您是否使用 MVVM 架构)。您可以将 contentpresenter 绑定到作为 UserControl 的属性。
6) 最坏的情况是每个客户端的布局必须非常灵活,以至于您只需为每个客户端创建一个新的 UserControl。您绑定到的基础数据对象可以保持不变,但通过每个 UserControl 公开不同的方面。
您对 WPF 的体验如何?要真正有效地完成这类事情,您需要研究数据绑定、视图、内容呈现器、列表/网格、用户控件。
由于您刚刚开始使用 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.
}
}