将用户选择的值附加到 ComboBox 中的预设字符串
Appending a user selected value onto a preset string in ComboBox
好的,我认为这是一个快速简单的过程,但我一直在努力寻找解决这个问题的方法。
我想要做的是有一个默认显示 "Rows: (value)" 的下拉菜单。打开下拉菜单时,我希望它仅显示可用值。
这是我的 C# 代码:
private void RowsComboBox_Loaded(object sender, RoutedEventArgs e)
{
List<int> data = new List<int>();
data.Add(2);
data.Add(3);
data.Add(4);
data.Add(5);
data.Add(6);
data.Add(7);
data.Add(8);
var comboBox = sender as ComboBox;
comboBox.ItemsSource = data;
comboBox.SelectedIndex = 0;
}
private void RowsComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var comboBox = sender as ComboBox;
string value = comboBox.SelectedItem.ToString();
}
XAML:
<ComboBox x:Name="RowsComboBox" Loaded="RowsComboBox_Loaded" SelectionChanged="RowsComboBox_SelectionChanged"/>
现在我可以更改值,但我只能显示文本或值,但不能同时显示。
我可以做一些变通办法,但这让我很恼火,以至于我想要一个答案只是为了看看它是如何完成的。
您需要使用 ItemTemplates 来执行此操作:
看看:https://meleak.wordpress.com/2012/05/13/different-combobox-itemtemplate-for-dropdown/
它做你想做的事,但方式恰恰相反。
希望对您有所帮助。但请记住,它对于您想要的简单东西来说相当大 :D
我不认为你真的想要 "Rows: " 文本 在 组合框控件中:
<StackPanel Orientation="Horizontal">
<Label x:Name="RowsLabel" Content="Rows:"/>
<ComboBox x:Name="RowsComboBox"/>
</StackPanel>
StackPanel
通过将静态标签 "Rows:" 与您的组合并排放置来完成您想要的。
如果这就是您要找的,请告诉我。
我发现在 ComboBox 中同时显示 "Rows: " 和用户选择的问题可以像 John Castleman 描述的使用 StackPanel
一样解决
<ComboBox x:Name="cbRows" Loaded="Rows_Loaded" SelectionChanged="Rows_SelectionChanged" Width="Auto" Height="Auto" ItemContainerStyle="{StaticResource DropDownItemStyle}">
<ComboBox.ItemTemplate>
<DataTemplate >
<StackPanel Orientation="Horizontal" ToolTipService.ShowOnDisabled="True" Background="Transparent" Margin="0,1.5,0,1.5">
<TextBlock Text="Rows: " Width="Auto" Height="Auto" Margin="5,0,5,0"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0" Text="{Binding}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
如您所见,我还使用了 ItemContainerStyle 来确保下拉菜单在 ComboBox 展开时仅显示可选择的值。我使用的样式是:
<Style TargetType="{x:Type ComboBoxItem}" x:Key="DropDownItemStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<Grid SnapsToDevicePixels="true" Width="Auto" Height="Auto">
<Border x:Name="Border" CornerRadius="2,2,2,2">
<StackPanel HorizontalAlignment="Stretch" Width="Auto" Height="Auto">
<TextBlock Text="{Binding}" HorizontalAlignment="Stretch" Width="Auto" Height="Auto" VerticalAlignment="Center" x:Name="TextBlock"/>
</StackPanel>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="true">
<Setter Property="Background" TargetName="Border" Value="#FF3399FF"/>
<Setter Property="Foreground" TargetName="TextBlock" Value="White"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
好的,我认为这是一个快速简单的过程,但我一直在努力寻找解决这个问题的方法。
我想要做的是有一个默认显示 "Rows: (value)" 的下拉菜单。打开下拉菜单时,我希望它仅显示可用值。
这是我的 C# 代码:
private void RowsComboBox_Loaded(object sender, RoutedEventArgs e)
{
List<int> data = new List<int>();
data.Add(2);
data.Add(3);
data.Add(4);
data.Add(5);
data.Add(6);
data.Add(7);
data.Add(8);
var comboBox = sender as ComboBox;
comboBox.ItemsSource = data;
comboBox.SelectedIndex = 0;
}
private void RowsComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var comboBox = sender as ComboBox;
string value = comboBox.SelectedItem.ToString();
}
XAML:
<ComboBox x:Name="RowsComboBox" Loaded="RowsComboBox_Loaded" SelectionChanged="RowsComboBox_SelectionChanged"/>
现在我可以更改值,但我只能显示文本或值,但不能同时显示。 我可以做一些变通办法,但这让我很恼火,以至于我想要一个答案只是为了看看它是如何完成的。
您需要使用 ItemTemplates 来执行此操作: 看看:https://meleak.wordpress.com/2012/05/13/different-combobox-itemtemplate-for-dropdown/
它做你想做的事,但方式恰恰相反。
希望对您有所帮助。但请记住,它对于您想要的简单东西来说相当大 :D
我不认为你真的想要 "Rows: " 文本 在 组合框控件中:
<StackPanel Orientation="Horizontal">
<Label x:Name="RowsLabel" Content="Rows:"/>
<ComboBox x:Name="RowsComboBox"/>
</StackPanel>
StackPanel
通过将静态标签 "Rows:" 与您的组合并排放置来完成您想要的。
如果这就是您要找的,请告诉我。
我发现在 ComboBox 中同时显示 "Rows: " 和用户选择的问题可以像 John Castleman 描述的使用 StackPanel
一样解决<ComboBox x:Name="cbRows" Loaded="Rows_Loaded" SelectionChanged="Rows_SelectionChanged" Width="Auto" Height="Auto" ItemContainerStyle="{StaticResource DropDownItemStyle}">
<ComboBox.ItemTemplate>
<DataTemplate >
<StackPanel Orientation="Horizontal" ToolTipService.ShowOnDisabled="True" Background="Transparent" Margin="0,1.5,0,1.5">
<TextBlock Text="Rows: " Width="Auto" Height="Auto" Margin="5,0,5,0"/>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0" Text="{Binding}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
如您所见,我还使用了 ItemContainerStyle 来确保下拉菜单在 ComboBox 展开时仅显示可选择的值。我使用的样式是:
<Style TargetType="{x:Type ComboBoxItem}" x:Key="DropDownItemStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<Grid SnapsToDevicePixels="true" Width="Auto" Height="Auto">
<Border x:Name="Border" CornerRadius="2,2,2,2">
<StackPanel HorizontalAlignment="Stretch" Width="Auto" Height="Auto">
<TextBlock Text="{Binding}" HorizontalAlignment="Stretch" Width="Auto" Height="Auto" VerticalAlignment="Center" x:Name="TextBlock"/>
</StackPanel>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="true">
<Setter Property="Background" TargetName="Border" Value="#FF3399FF"/>
<Setter Property="Foreground" TargetName="TextBlock" Value="White"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>