在Expression Blend中使用Silverlight Toolkit控件的XamlParseException

时间:2010-01-20 19:51:25

标签: silverlight xaml expression-blend silverlight-toolkit xamlparseexception

使用Silverlight Toolkit控件时,我在Expression Blend中打开UserControl时遇到一个奇怪的问题。我的UserControl使用工具包的ListBoxDragDropTarget,如下所示:

<controlsToolkit:ListBoxDragDropTarget mswindows:DragDrop.AllowDrop="True" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
        <ListBox ItemsSource="{Binding MyItemControls}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <controlsToolkit:WrapPanel/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
</controlsToolkit:ListBoxDragDropTarget>

一切都在运行时按预期工作,在Visual Studio 2008中看起来很好。但是,当我尝试在Blend中打开我的UserControl时,我得到 XamlParseException:[Line:0 Position:0] 我可以在设计视图中看不到任何内容。更具体地说,Blend抱怨:

  

由于System.Windows.Controls.ListBoxDragDropTarget:TargetType不匹配问题,无法显示元素“ListBoxDragDropTarget”。

我的silverlight应用程序引用了2009年11月工具包版本中的System.Windows.Controls.Toolkit,我确保为ListBoxDragDropTarget包含这些命名空间声明:

xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
xmlns:mswindows="clr-namespace:Microsoft.Windows;assembly=System.Windows.Controls.Toolkit"

如果我注释掉ListBoxDragDropTarget控件包装并且只是离开ListBox,我可以在设计视图中看到一切没有错误。此外,我意识到这种情况正在发生在各种Silverlight Toolkit控件中,因为如果我注释掉ListBoxDragDropTarget并将其替换为

<controlsToolkit:BusyIndicator />

Blend中出现同样的错误。甚至更奇怪的是,如果我在混合中启动一个全新的silverlight应用程序,我可以添加这些工具包元素而不会出现任何错误,因此我的项目引用工具包程序集似乎发生了一些愚蠢的事情。

我很确定这与从generic.xaml加载工具包控件的默认样式有关,因为错误与TargetType有关,Blend可能正在尝试加载默认样式。 / p>

之前有没有人遇到过这个问题,或者对我的问题有什么想法?

4 个答案:

答案 0 :(得分:11)

您好我们有完全相同的问题,我们通过检查项目中存在此问题的引用来解决它。所有引用的工具包程序集都应位于磁盘上的同一目录中。

我们对System.Windows.Controls.Toolkit.dll的项目引用总是“跳回”导致我们问题的原始路径。我们通过在notepad ++(或任何你喜欢的文本编辑器)中编辑项目文件来解决,并硬编码它可以找到程序集的路径。

希望这有帮助。

答案 1 :(得分:5)

对于Visual Studio(也可能是Blend),您需要添加对:

的引用

System.Windows.Controls.Toolkit.Internals.dll

“C:\ Program Files \ Microsoft SDKs \ Silverlight \ v4.0 \ Toolkit \ Apr10 \ Bin \ System.Windows.Controls.Toolkit.Internals.dll”

答案 2 :(得分:1)

我正在使用Silverlight 5工具包并且在Expression Blend for SL 5中使用XamlParseException工具包控件时使用BusyIndicator,所有上述解决方案都没有帮助,但我发现了另一种解决方法,它相当脏但是允许我让BusyIndecator在Expression Blend中工作,

  1. 派生自控件

    public class BusyIndicatorEx : BusyIndicator
    {
        public BusyIndicatorEx()
        {
            this.DefaultStyleKey = typeof(BusyIndicatorEx);
        } 
    }
    
  2. 为派生控件创建样式(只需将样式从BusyIndicator源代码复制到themes / generic.xaml,并将目标类型更改为local:BusyIndicatorEx

答案 3 :(得分:0)

我遇到了同样的问题,这个问题已通过在Wrap Panel中的代码中引入虚拟引用来解决。

我知道这是一个小小的C ++,但我可以想象这是因为我们间接引用了在模板中包装面板而不是在顶级页面上,因此加载器不知道在初始化时要加载什么。不过,我真的很想了解确切的原因。

我刚刚引用了System.Windows.Controls.Toolkit并在代码中引入了以下成员:

System.Windows.Controls.WrapPanel _dummy;