我想从打开的 WPF 组合框中隐藏选定的项目,基本上是为了显示而不是这个:
item2
item1
item2
item3
这:
item2
item1
item3
如何才能做到这一点?
我想从打开的 WPF 组合框中隐藏选定的项目,基本上是为了显示而不是这个:
item2
item1
item2
item3
这:
item2
item1
item3
如何才能做到这一点?
为什么不更改所选项目的可见性呢?
由于组合框的项目视图是从它包含的项目集合中自动生成的,因此
您需要做的是从组合框的项目中删除选定的项目并设置 IsEditable="True" 以便选择有效。
您可以在包含选择的组合框上方放置一个标签,以防止用户在组合框中键入。
另一种解决方案是使用 2 个组合框,一个包含所有项目,一个包含所有项目,但在第一个组合框中选择的项目。
然后阻止第一个组合框展开并将其放在第二个组合框上方。
为此找到了一个技巧,在组合框顶部放置了一个标签:
Window1.xaml:
<Window x:Class="WpfApplication2.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">
<Grid>
<ComboBox Height="23" Margin="53,42,105,0" Name="comboBox1" VerticalAlignment="Top"
SelectionChanged="comboBox1_SelectionChanged" DropDownOpened="comboBox1_DropDownOpened"
DropDownClosed="comboBox1_DropDownClosed" GotFocus="comboBox1_GotFocus"
LostFocus="comboBox1_LostFocus"/>
<Label Height="23" Margin="53,42,105,0" Name="label1" VerticalAlignment="Top" IsHitTestVisible="False">
almafa
</Label>
<Button Height="23" Margin="89,0,114,108" Name="button1" VerticalAlignment="Bottom">Button</Button>
</Grid>
</Window>
Window1.xaml.cs:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace WpfApplication2
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
comboBox1.Items.Add("alma");
comboBox1.Items.Add("korte");
comboBox1.Items.Add("szilva");
}
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (comboBox1.SelectedItem != null)
comboBox1.SelectedItem = null;
}
private void comboBox1_DropDownOpened(object sender, EventArgs e)
{
label1.Foreground = Brushes.Black;
}
private void comboBox1_DropDownClosed(object sender, EventArgs e)
{
label1.Foreground = Brushes.White;
}
private void comboBox1_GotFocus(object sender, RoutedEventArgs e)
{
if (!comboBox1.IsDropDownOpen)
label1.Foreground = Brushes.White;
}
private void comboBox1_LostFocus(object sender, RoutedEventArgs e)
{
label1.Foreground = Brushes.Black;
}
}
}