我有一个组合框,显示可用系统颜色的列表。组合框中的每个项目都有一个预览矩形和文本颜色名称。在给定时间,我可能同时在屏幕上需要多达6个这样的组合框。我创建了一个静态的项目列表,可以在所有组合框中重用,以减少开销。它工作正常,速度很快,但现在当我更改其他组合框属性(如将字体粗细设置为粗体)时,它会影响所有组合框,而不仅仅是我应用属性的组合框。
这是我的代码,全部用代码完成。
我重复使用的列表声明和组合框:
static private List<ListViewItem> _colorItems = null;
ComboBox _comboBoxColorList;
然后在包含组合框的我的控件的构造函数中,我有了初始创建列表的代码:
if (_colorItems == null)
{
_colorItems = new List<ListViewItem>();
PropertyInfo[] colorProperties = typeof(Colors).GetProperties(BindingFlags.Static | BindingFlags.Public);
Dictionary<String, Color> colorDictionary = colorProperties.ToDictionary(p => p.Name, p => (Color)p.GetValue(null, null));
ListViewItem newItem;
foreach (KeyValuePair<String, Color> keyPair in colorDictionary)
{
newItem = CreateListViewItem(keyPair.Key, keyPair.Value);
_colorItems.Add(newItem);
}
}
然后我创建了组合框:
_comboBoxColorList = new ComboBox();
_comboBoxColorList.Height = Constants.ListViewPropertyComboBoxHeight;
_comboBoxColorList.VerticalContentAlignment = VerticalAlignment.Center;
_comboBoxColorList.Background = Brushes.White;
_comboBoxColorList.ItemsSource = _colorItems;
_comboBoxColorList.SelectionChanged += new SelectionChangedEventHandler(comboBoxColorList_SelectionChanged);
Children.Add(_comboBoxColorList);
然后在事件处理程序中我有一个代码将组合框设置为粗体:
_comboBoxColorList.FontWeight = FontWeights.Bold;
如果我这样做,_colorItems不是静态的,那么每个行为都应该如此,但它很慢。当_colorItems是静态时它非常快,但上面的行使得所有组合框都共享项目源粗体。
任何见解或智慧都会很棒。
答案 0 :(得分:1)
不要直接创建ListBoxItems
,而是让框架完成。事实上,你可以在XAML中完成很多代码。
简化:
使用您创建的新课程创建ObservableCollection
,可以调用它ColorInfo
添加所有属性,例如名称,真实颜色。并用所有颜色填充此列表。
这可以根据需要重复使用。
class ColorInfo
{
public Color Color{get;set;}
public string Name{get;set;}
}
ObservableCollection<ColorInfo> myColors;
现在,您将此列表设置为ItemsSource
的{{1}}。最后,您提供了一个项目模板,每个条目应该如何。
ComboBox
当然,您可以提取模板并通过StaticResource引用它。
答案 1 :(得分:0)
如果那些ListViewItems
是框架中的那些,那么你就不应该这样做。如果您有一个在控件之间共享的列表,它应该只包含数据,而不是UI元素。如果您需要以特定方式显示数据,请使用ItemTemplate
和/或ItemContainerStyle
。
(只是设置ItemsSource不是一种绑定方式......)