UWP ComboBox IsEditable 无法正常工作
UWP ComboBox IsEditable does not work right
这是我的代码,组合框控件包含文本和图像:
XAML 代码:
<ComboBox Name="cb1"
VerticalAlignment="Center" HorizontalAlignment="Center"
Header="Abcd"
IsEditable="True"
Margin="5"
Width="120">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Icon}" Width="20" Height="20" Margin="5,0,10,0"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
C# 代码:
public sealed partial class SamplePage2 : Page
{
public SamplePage2()
{
InitializeComponent();
cb1.Items.Add(new Model
{
Icon = new BitmapImage(new Uri("ms-appx:///Assets/Images/mecca.png")),
Text = "بقره"
});
cb1.Items.Add(new Model
{
Icon = new BitmapImage(new Uri("ms-appx:///Assets/Images/medina.png")),
Text = "فاتحه"
});
cb1.SelectedIndex = 0;
}
class Model
{
public BitmapImage Icon { get; set; }
public string Text { get; set; }
}
}
但是当我点击指针按钮,或者点击文本内部...时,看到这张图片:
我该如何解决这个问题?
注意:我需要 'IsEditable' 功能 [ 因为我希望用户通过编写文本快速到达所需的选项。 ]
UWP ComboBox IsEditable does not work right
问题是显示成员是模型class,所以它是不可编辑的,对于你的场景,我们建议你制作一个字符串集合作为ComboBox数据源。然后使用图像转换器根据项目的内容设置图像源。更多请参考这个案例reply.
<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>
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();
}
}
这是我的代码,组合框控件包含文本和图像:
XAML 代码:
<ComboBox Name="cb1"
VerticalAlignment="Center" HorizontalAlignment="Center"
Header="Abcd"
IsEditable="True"
Margin="5"
Width="120">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Icon}" Width="20" Height="20" Margin="5,0,10,0"/>
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
C# 代码:
public sealed partial class SamplePage2 : Page
{
public SamplePage2()
{
InitializeComponent();
cb1.Items.Add(new Model
{
Icon = new BitmapImage(new Uri("ms-appx:///Assets/Images/mecca.png")),
Text = "بقره"
});
cb1.Items.Add(new Model
{
Icon = new BitmapImage(new Uri("ms-appx:///Assets/Images/medina.png")),
Text = "فاتحه"
});
cb1.SelectedIndex = 0;
}
class Model
{
public BitmapImage Icon { get; set; }
public string Text { get; set; }
}
}
但是当我点击指针按钮,或者点击文本内部...时,看到这张图片:
我该如何解决这个问题?
注意:我需要 'IsEditable' 功能 [ 因为我希望用户通过编写文本快速到达所需的选项。 ]
UWP ComboBox IsEditable does not work right
问题是显示成员是模型class,所以它是不可编辑的,对于你的场景,我们建议你制作一个字符串集合作为ComboBox数据源。然后使用图像转换器根据项目的内容设置图像源。更多请参考这个案例reply.
<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>
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();
}
}