动态加载的示例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()找到它需要的东西?
答案 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