介绍
首先介绍下要实现的任务。做一个下拉框,当选择每个项的时候将鼠标发在上面显示该项的ToolTip的内容(Image)。
实现
Model:
1 public class SkinInfo : NotificationObject 2 { 3 private string name; 4 private string assemblyName; 5 6 public string AssemblyName 7 { 8 get { return assemblyName; } 9 set 10 { 11 if (this.assemblyName != value) 12 { 13 assemblyName = value; 14 base.RaisePropertyChanged("AssemblyName"); 15 } 16 } 17 } 18 public string Name 19 { 20 get { return name; } 21 set 22 { 23 if (this.name != value) 24 { 25 name = value; 26 base.RaisePropertyChanged("Name"); 27 } 28 } 29 }
public string Path { get; set; } 30 [XmlIgnore] 31 public ImageSource Image { get; set; } 32 public SkinInfo() 33 { 34 35 } 36 37 public SkinInfo(string skin) 38 { 39 var items = skin.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries); 40 this.Name = items[0]; 41 this.AssemblyName = items[1]; 42 string uriStr = string.Format("/BasicInfoModule;component/Resources/{0}.png", this.Name); 43 this.Image = new BitmapImage(new Uri(uriStr, UriKind.Relative));
this.Path=uriStr; 44 } 45 }
ViewModel:
public class DUTInfo : NotificationObject { public ObservableCollection<AccessoryInfo> Accessories { get; set; } [XmlIgnore] public ObservableCollection<SkinInfo> Skins { get; private set; } public DUTInfo() { this.Skins = new ObservableCollection<SkinInfo>( Config.Instance.Skins.Select<string, SkinInfo>(s => new SkinInfo(s))); } }
Xaml文件:
1 <ComboBox Grid.Row="2" Grid.Column="1" ItemsSource="{Binding Skins}" SelectedValue="{Binding SelectedSkin}"> 2 <ComboBox.ItemTemplate> 3 <DataTemplate> 4 <Label Content="{Binding Name}" Margin="0"> 5 <Label.ToolTip> 7 <Image Source="{Binding Image}" /> 9 </Label.ToolTip> 10 </Label> 11 </DataTemplate> 12 </ComboBox.ItemTemplate> 13 </ComboBox>
测试
此时实现啦功能,现在应该测试下,我打开界面点开下拉框,鼠标在每个Item的位置来回切换时,较短时间后会引发异常:
Specified element is already the logical child of another element. Disconnect it first.
(意思:指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。)
然后我将图片的绑定属性改为 <Image Source="{Binding Path}" />,此时还会触发异常,但是鼠标在每个Item的位置来回切换时间较长,最总还会引发相同异常。
我想应该是:如果不清除他与前一个父控件的关系,则会报此类错误,解决办法是,再重新作为新的父控件的Content之前,清除他的父类绑定即可。
我仔细想了想ToolTip的功能不会这么弱吧,然后我在<Label.ToolTip>之间顺意输入看看包含了那些属性,我发现有一个<ToolTip>。
我加上之后,重新测试,很长一段时间,都没报错,姑且这么认为是解决了吧!!
最总Xaml文件代码ToolTip改为:
<Label.ToolTip> <ToolTip> <Image Source="{Binding Image}" /> </ToolTip> </Label.ToolTip>