如何使 isTextSearchEnabled 属性 在文本开头带有图标的组合框的情况下工作?
How to make isTextSearchEnabled property work in case of ComboBox with icons in the beginning of text?
在 ComboBox 中,我们可以通过键入项目的前几个字母来跳转到该项目。这是设置 IsTextSearchEnabled
属性 时,默认为 true。
我有一个自定义的 ComboBox,开头是图像,后面是简短的文本。
icon1 + Violet
icon2 + Red
icon3 + Blue
如果我键入 "r",我希望导航到下拉列表中的 Red
项。但是,由于开头有一个图标,IsTextSearchEnabled
属性 没有按预期运行。
我怎样才能使这个工作?
例如,在MyDropdown.cpp
中,我有
MyDropDownItem^ comboItem = ref new MyDropDownItem(icon, title);
sourceItems->Append(comboItem);
sourceItems
是此控件的 ItemsSource 使用的项目列表。每个组合框项目都有不同的图像(图标),因此,图像源不能在 xaml 模板中静态定义。
How to make isTextEnabled property work in case of ComboBox with icons in the beginning of text?
您可以将 ComboBox ItemsSource
与字符串集合绑定,然后自定义项目内容,如下所示,当您输入文本时,它将与 ItemsSource
.
匹配
<ComboBox
x:Name="MyComboBox"
Width="200"
Header="Colors"
IsEditable="True"
Loaded="ComboBox_Loaded"
>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image
Width="22"
Height="22"
Source="Assets/StoreLogo.png"
/>
<TextBlock
Margin="10"
Text="{Binding}"
TextAlignment="Center"
/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
MyComboBox.ItemsSource = new List<string>() { "Red", "Green", "Blue" };
}
更新
public class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
string resaut = string.Empty;
switch (value.ToString())
{
case "Blue":
resaut = "ms-appx:///Assets/BlueImage.png";
break;
case "Green":
resaut = "ms-appx:///Assets/GreenImage.png";
break;
case "Red":
resaut = "ms-appx:///Assets/RedImage.png";
break;
default:
break;
}
return resaut;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
用法
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image
Width="22"
Height="22"
Source="{Binding Converter={StaticResource ImageConverter}}"
/>
<TextBlock
Margin="10"
Text="{Binding}"
TextAlignment="Center"
/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
在 ComboBox 中,我们可以通过键入项目的前几个字母来跳转到该项目。这是设置 IsTextSearchEnabled
属性 时,默认为 true。
我有一个自定义的 ComboBox,开头是图像,后面是简短的文本。
icon1 + Violet
icon2 + Red
icon3 + Blue
如果我键入 "r",我希望导航到下拉列表中的 Red
项。但是,由于开头有一个图标,IsTextSearchEnabled
属性 没有按预期运行。
我怎样才能使这个工作?
例如,在MyDropdown.cpp
中,我有
MyDropDownItem^ comboItem = ref new MyDropDownItem(icon, title);
sourceItems->Append(comboItem);
sourceItems
是此控件的 ItemsSource 使用的项目列表。每个组合框项目都有不同的图像(图标),因此,图像源不能在 xaml 模板中静态定义。
How to make isTextEnabled property work in case of ComboBox with icons in the beginning of text?
您可以将 ComboBox ItemsSource
与字符串集合绑定,然后自定义项目内容,如下所示,当您输入文本时,它将与 ItemsSource
.
<ComboBox
x:Name="MyComboBox"
Width="200"
Header="Colors"
IsEditable="True"
Loaded="ComboBox_Loaded"
>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image
Width="22"
Height="22"
Source="Assets/StoreLogo.png"
/>
<TextBlock
Margin="10"
Text="{Binding}"
TextAlignment="Center"
/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
MyComboBox.ItemsSource = new List<string>() { "Red", "Green", "Blue" };
}
更新
public class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
string resaut = string.Empty;
switch (value.ToString())
{
case "Blue":
resaut = "ms-appx:///Assets/BlueImage.png";
break;
case "Green":
resaut = "ms-appx:///Assets/GreenImage.png";
break;
case "Red":
resaut = "ms-appx:///Assets/RedImage.png";
break;
default:
break;
}
return resaut;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
用法
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image
Width="22"
Height="22"
Source="{Binding Converter={StaticResource ImageConverter}}"
/>
<TextBlock
Margin="10"
Text="{Binding}"
TextAlignment="Center"
/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>