アプリケーションに、豊富なテキストボックスとデータグリッドを備えた UserInput フォームがあります。一部のクライアントは毎回それらすべてを使用しません...そのため、ユーザーがボタンまたはチェックボックスをクリックすると、一部が動的に表示されるようにしたいと思います。
オンラインでヘルプを検索してみましたが、うまくいきません。
アドバイスをよろしくお願いします
アプリケーションに、豊富なテキストボックスとデータグリッドを備えた UserInput フォームがあります。一部のクライアントは毎回それらすべてを使用しません...そのため、ユーザーがボタンまたはチェックボックスをクリックすると、一部が動的に表示されるようにしたいと思います。
オンラインでヘルプを検索してみましたが、うまくいきません。
アドバイスをよろしくお願いします
1) 最初の基本的な質問 - 大量のテキストボックスとデータグリッドが必要ですか? これは、紛らわしいユーザー インターフェイスになる可能性があるように思えます。私は常に最初にユーザー インターフェイスを簡素化しようとします。
2) コントロールは固定レイアウトにする必要がありますか? コントロールの可視性をオンまたはオフにするのと同じくらい簡単ですか?
3) コントロール レイアウトを動的にする必要がある場合は、コントロール ".Add(new Button(...))" をリスト/グリッドに動的に追加できます。いくつかの単純な変更以上のものにこのアプローチをお勧めするかどうかはわかりません。
4) すべてのクライアントに共通のコントロールはありますか?
5) 共通のコントロールがある場合は、UserControl を使用してそれらをグループ化し、ContentPresenter またはその他のコントロールを使用してフォームに動的に追加することを検討してください (これを行う正確な方法は、MVVM アーキテクチャを使用しているかどうかによって異なります)。contentpresenter を UserControl であるプロパティにバインドできます。
6) 最悪のケースは、クライアントごとに新しい UserControl を作成するだけで済むように、クライアントごとにレイアウトを非常に柔軟にする必要がある場合です。バインド先の基になるデータ オブジェクトは同じままである可能性がありますが、各 UserControl を通じてさまざまな側面が公開されるだけです。
WPF の経験はどれくらいありますか? この種のことを本当に効果的に行うには、データ バインディング、ビュー、コンテンツ プレゼンター、リスト/グリッド、UserControls を調査する必要があります。
あなたは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 を使用して Visiblity を変更すると、より適切な場合があります。
/// <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.
}
}