动态加载使用具有代码隐藏的类型的XAML

时间:2012-07-09 19:45:27

标签: wpf xaml

动态加载的示例XAML

<Grid xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'     
      xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' 
      xmlns:usercontrols='clr-namespace:App.Views.UserControls'>

         <TextBlock>Why don't you click the button?</TextBlock>

         <usercontrols:SuperButton
         Command="{Binding DataContext.OpenURLNew,RelativeSource=
           {RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}"
         CommandParameter="50">

         ClickMe</usercontrols:SuperButton>
</Grid>

尽管事实上SuperButton是在同一个程序集中定义的,但是加载它失败并且“无法加载未知类型的usercontrols:superbutton”。

我猜这是因为SuperButton已经关联了代码隐藏?有没有办法帮助XamlReader.Load()找到它需要的东西?

1 个答案:

答案 0 :(得分:2)

您正在做的事情应该工作 - 尝试使用xmlns:usercontrols=''中的完全限定的程序集名称。

我曾经做过这件事(也许我写的netGooey库可能对你有用)。 netGooey动态地将XAML加载到页面中,并支持用户定义的控件。

我的XAML标题如下所示:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="499" Height="579" xmlns:playback="clr-namespace:inlayShared.ui.controls.playback;assembly=inlayShared" xmlns:library="clr-namespace:inlayShared.ui.controls.library;assembly=inlayShared">

控制使用如下:

<playback:volumeSlider Maximum="100" Minimum="0" Margin="42,180,62,0" Height="30" VerticalAlignment="Top" TickFrequency="10" TickPlacement="BottomRight" />

动态XAML加载如下:

            _gSystem.invokeOnLocalThread((Action)(() =>
            {
                FileStream fileStream = File.OpenRead(_sUIFile);
                DependencyObject dependencyObject = XamlReader.Load(fileStream) as DependencyObject;
                fileStream.Close();

                if (dependencyObject == null)
                    return;

                Content = dependencyObject;
            }), true);`

也许我忘记了让XAML注意到自定义控件的一些关键部分,但我很确定它刚刚结束了。

祝你好运。 (希望完全合格的更改可以为您修复)

http://inlay.codeplex.com/SourceControl/changeset/view/42822#549758