• WPF控件ComboBox 每个Item的ToolTip引发的异常


    介绍

     首先介绍下要实现的任务。做一个下拉框,当选择每个项的时候将鼠标发在上面显示该项的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>
  • 相关阅读:
    WordPress错误:无法启用插件,因为它引起了一个致命错误
    快速使用 Thinkphp 之一: 准备工作-配置PHP环境及下载Thinkphp文件
    基于XML文件格式引用页面
    PHP清除html、css、js格式并去除空格的PHP函数
    本地无法启动MySQL服务,报的错误:1067,进程意外终止
    快速使用 Thinkphp 之二: 创建自己的应用项目
    HTML页面里加载flash文件源码
    【学习笔记】数据库 windrainpy
    【转】给年轻程序员的建议 windrainpy
    【转】js变量以及其作用域详解 windrainpy
  • 原文地址:https://www.cnblogs.com/kissfu/p/3232562.html
Copyright © 2020-2023  润新知