组合框选择上的动态控制集
Dynamic Control sets on combobox selection
我有几个实例,其中用户可能需要根据组合框选择输入额外数据。必要文本框的数量会根据选择而变化(最少 1 个 - 最多 3 个)。为了使这些项目井井有条,我将它们放在 GroupBox 中。我需要的是实现这种效果的建议。我应该以编程方式将行添加到组框内的网格吗?我是否应该创建所有文本框和标签并在选择更改事件中更改可见性 属性?我不太喜欢第二个想法,因为如果只需要一个文本字段,组框将被不适当地缩放。我意识到我的问题的一般背景,作为 WPF 的新手,我只需要一些关于最佳实践的建议来实现这一点。
更新
我试图在选择更改时折叠行。这会删除内容,但仍会使我的组框保持相同大小。
<GroupBox Name="gbCondensor" Height="Auto" Header="Condensor"
FontSize="16" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2"
Margin="20,0,20,92" Grid.RowSpan="2">
<Grid Name="grdCondensor" Margin="0,10,0,0" Height="auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label x:Name="lblCondensorTemp" Grid.Column="0" Grid.Row="0"
Content="Condensor Temperature" HorizontalAlignment="Center"
VerticalAlignment="Center" Height="32" Width="255"/>
<ComboBox Name="cmbCondensorTemp" FontSize= "16" Width="200"
Grid.Column="1" Grid.Row="0" VerticalAlignment="Center"
HorizontalAlignment="Left" Margin="10,0" Height="30">
<ComboBoxItem IsSelected="True">Constant</ComboBoxItem>
<ComboBoxItem>Linear</ComboBoxItem>
<ComboBoxItem>Switching</ComboBoxItem>
</ComboBox>
<Label Name="lblCondensorTempText" Content="Temperature"
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0"
Grid.Row="2" ></Label>
<TextBox Name="txtCondensorTemp" Grid.Column="1" Grid.Row="2"
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"
Width="73"></TextBox>
<Label Name="lblEndCondTemp" Content="Temperature"
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0"
Grid.Row="3" ></Label>
<TextBox Name="txtEndCondTemp" Grid.Column="1" Grid.Row="3"
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"
Width="73"></TextBox>
<Label Name="lblSwitchCondTemp" Content="Temperature"
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0"
Grid.Row="4" ></Label>
<TextBox Name="txtSwitchCondTemp" Grid.Column="1" Grid.Row="4"
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"
Width="73"></TextBox>
</GroupBox>
用这个折叠代码中的行:
void CheckCondensorComboBox(object sender, SelectionChangedEventArgs e)
{
if (cmbCondensorTemp.SelectedIndex == 0)
{
lblEndCondTemp.Visibility = Visibility.Collapsed;
txtEndCondTemp.Visibility = Visibility.Collapsed;
grdCondensor.RowDefinitions[3].Height = new GridLength(0);
lblSwitchCondTemp.Visibility = Visibility.Collapsed;
txtSwitchCondTemp.Visibility = Visibility.Collapsed;
grdCondensor.RowDefinitions[4].Height = new GridLength(0);
}
else if (cmbCondensorTemp.SelectedIndex == 1)
{
lblEndCondTemp.Visibility = Visibility.Visible;
txtEndCondTemp.Visibility = Visibility.Visible;
grdCondensor.RowDefinitions[3].Height = new GridLength(30);
lblSwitchCondTemp.Visibility = Visibility.Collapsed;
txtSwitchCondTemp.Visibility = Visibility.Collapsed;
grdCondensor.RowDefinitions[4].Height = new GridLength(0);
}
else if (cmbCondensorTemp.SelectedIndex == 2)
{
lblEndCondTemp.Visibility = Visibility.Visible;
txtEndCondTemp.Visibility = Visibility.Visible;
grdCondensor.RowDefinitions[3].Height = new GridLength(30);
lblSwitchCondTemp.Visibility = Visibility.Visible;
txtSwitchCondTemp.Visibility = Visibility.Visible;
grdCondensor.RowDefinitions[4].Height = new GridLength(30);
}
}
我在这里想要的是一个组框,它可以根据每个用户选择所需的控件更改其高度。
你的两个想法都有道理。如果没有看到代码,这个问题有点难以具体回答,但一般来说,我喜欢首先考虑可维护性——代码通常被阅读的次数比编写的次数多得多。
我怀疑简单地折叠不需要的额外字段可能比创建额外字段并在 运行 时绑定它们更直接和可维护。
尝试一种方法,看看效果如何 - 不要花太多时间权衡。
我有几个实例,其中用户可能需要根据组合框选择输入额外数据。必要文本框的数量会根据选择而变化(最少 1 个 - 最多 3 个)。为了使这些项目井井有条,我将它们放在 GroupBox 中。我需要的是实现这种效果的建议。我应该以编程方式将行添加到组框内的网格吗?我是否应该创建所有文本框和标签并在选择更改事件中更改可见性 属性?我不太喜欢第二个想法,因为如果只需要一个文本字段,组框将被不适当地缩放。我意识到我的问题的一般背景,作为 WPF 的新手,我只需要一些关于最佳实践的建议来实现这一点。
更新 我试图在选择更改时折叠行。这会删除内容,但仍会使我的组框保持相同大小。
<GroupBox Name="gbCondensor" Height="Auto" Header="Condensor"
FontSize="16" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2"
Margin="20,0,20,92" Grid.RowSpan="2">
<Grid Name="grdCondensor" Margin="0,10,0,0" Height="auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label x:Name="lblCondensorTemp" Grid.Column="0" Grid.Row="0"
Content="Condensor Temperature" HorizontalAlignment="Center"
VerticalAlignment="Center" Height="32" Width="255"/>
<ComboBox Name="cmbCondensorTemp" FontSize= "16" Width="200"
Grid.Column="1" Grid.Row="0" VerticalAlignment="Center"
HorizontalAlignment="Left" Margin="10,0" Height="30">
<ComboBoxItem IsSelected="True">Constant</ComboBoxItem>
<ComboBoxItem>Linear</ComboBoxItem>
<ComboBoxItem>Switching</ComboBoxItem>
</ComboBox>
<Label Name="lblCondensorTempText" Content="Temperature"
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0"
Grid.Row="2" ></Label>
<TextBox Name="txtCondensorTemp" Grid.Column="1" Grid.Row="2"
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"
Width="73"></TextBox>
<Label Name="lblEndCondTemp" Content="Temperature"
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0"
Grid.Row="3" ></Label>
<TextBox Name="txtEndCondTemp" Grid.Column="1" Grid.Row="3"
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"
Width="73"></TextBox>
<Label Name="lblSwitchCondTemp" Content="Temperature"
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0"
Grid.Row="4" ></Label>
<TextBox Name="txtSwitchCondTemp" Grid.Column="1" Grid.Row="4"
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"
Width="73"></TextBox>
</GroupBox>
用这个折叠代码中的行:
void CheckCondensorComboBox(object sender, SelectionChangedEventArgs e)
{
if (cmbCondensorTemp.SelectedIndex == 0)
{
lblEndCondTemp.Visibility = Visibility.Collapsed;
txtEndCondTemp.Visibility = Visibility.Collapsed;
grdCondensor.RowDefinitions[3].Height = new GridLength(0);
lblSwitchCondTemp.Visibility = Visibility.Collapsed;
txtSwitchCondTemp.Visibility = Visibility.Collapsed;
grdCondensor.RowDefinitions[4].Height = new GridLength(0);
}
else if (cmbCondensorTemp.SelectedIndex == 1)
{
lblEndCondTemp.Visibility = Visibility.Visible;
txtEndCondTemp.Visibility = Visibility.Visible;
grdCondensor.RowDefinitions[3].Height = new GridLength(30);
lblSwitchCondTemp.Visibility = Visibility.Collapsed;
txtSwitchCondTemp.Visibility = Visibility.Collapsed;
grdCondensor.RowDefinitions[4].Height = new GridLength(0);
}
else if (cmbCondensorTemp.SelectedIndex == 2)
{
lblEndCondTemp.Visibility = Visibility.Visible;
txtEndCondTemp.Visibility = Visibility.Visible;
grdCondensor.RowDefinitions[3].Height = new GridLength(30);
lblSwitchCondTemp.Visibility = Visibility.Visible;
txtSwitchCondTemp.Visibility = Visibility.Visible;
grdCondensor.RowDefinitions[4].Height = new GridLength(30);
}
}
我在这里想要的是一个组框,它可以根据每个用户选择所需的控件更改其高度。
你的两个想法都有道理。如果没有看到代码,这个问题有点难以具体回答,但一般来说,我喜欢首先考虑可维护性——代码通常被阅读的次数比编写的次数多得多。
我怀疑简单地折叠不需要的额外字段可能比创建额外字段并在 运行 时绑定它们更直接和可维护。
尝试一种方法,看看效果如何 - 不要花太多时间权衡。