none
求助:一个关于StaticResource奇怪的问题 RRS feed

  • 问题

  • 项目里面的代码比较多。我简单的写个demo,描述一下问题。

    新建一个WpfApplication。添加一个Dictionary1.xmal。在里面添加下面代码,显示一个椭圆。

     <Ellipse x:Key="ellipse" Fill="Yellow" ToolTip="Ellipse" IsHitTestVisible="false"/>
    
    

    在App.xaml中引用Dictionary1。代码如下:

     <Application.Resources>
    
      <ResourceDictionary>
    
       <ResourceDictionary.MergedDictionaries>
    
        <ResourceDictionary Source="Dictionary.xaml"/>
    
       </ResourceDictionary.MergedDictionaries>
    
      </ResourceDictionary>
    
     </Application.Resources>
    
    

    然后在窗体2中使用这个ellipse,显示这个椭圆,代码如下:

      <ContentControl FontSize="30" Content="{StaticResource ellipse}" Margin="0,0,0,12"/>

    在窗体1中添加一个按钮,在click事件中打开窗体2。

    第一次点击按钮,打开窗体2没有问题。

    第二次点击按钮,打开窗体2有问题。报错

    “设置属性“System.Windows.Controls.ContentControl.Content”时引发了异常。”,行号为“4”,行位置为“25”。

     

    2010年8月2日 10:12

答案

  • 您好 kaixin,

    主要原因是您在资源里面放的是一个Visual。当它第一次被绑定的时候会添加到窗口2的Visual树里。当窗口2关闭的时候,它也会被释放。所以第二次绑定会失败,因为已经释放了。

    解决方法是将资源项目设置成非共享,这样每次绑定会生产一个拷贝,而不是直接绑定。您可以参考下面的xaml:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Ellipse x:Key="ellipse" Fill="Yellow" ToolTip="Ellipse" IsHitTestVisible="false" x:Shared="False"/>
    </ResourceDictionary>
    

    Aland Li


    Please mark the replies as answers if they help and unmark if they don't. This can be beneficial to other community members reading the thread.
    • 已标记为答案 kaixin2010 2010年8月2日 11:52
    2010年8月2日 11:33
    版主