关于在运行时加载XAML的问题有很多, 但到目前为止,我可以说这不是重复。
我在运行时将XAML加载到控件中:
<ContentControl Content="{Binding Layout.View, Converter={StaticResource StringToXamlConverter}}"/>
转换器非常简单:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string xaml;
if (value != null)
{
xaml = value.ToString();
}
else
{
xaml = Settings.Default.DefaultLayoutView;
}
var root = XamlReader.Parse(xaml);
return root;
}
现在,在正在加载的XAML中,我需要使用ValueConverters。 转换器被定义为加载XAML的Window的资源。例如:
<c:BooleanToVisibilityValueConverter x:Key="BooleanToVisibilityConverter"/>
当然,如果我在阅读时尝试使用此资源,则XamlReader.Parse()方法会抛出异常。
Visibility="{Binding Layout.TextItem1.IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}}"
有没有办法解决这个问题? 也许是告诉XamlReader忽略这个的一种方法? 或者可能在这种情况下工作的ValueConverters的替代方案?
请注意,使用DynamicResource也不起作用。它们不能用于ValueConverters。
答案 0 :(得分:5)
的修订版强> 的
好的,你是对的,动态资源不起作用。我提出了两个解决方案,最好的部分是,我已经测试过,两者都会有效。
选择1:在应用程序资源app.xaml中定义静态资源
选择2:不要为转换器使用静态资源,只需在xaml中创建转换器。很抱歉没有关闭您正在使用的xaml,但您会明白这一点:
<Button>
<Button.Visibility>
<Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}">
<Binding.Converter>
<controls:BooleanToVisibilityConverter />
</Binding.Converter>
</Binding>
</Button.Visibility>
<Button.Tag>
<sys:Boolean>True</sys:Boolean>
</Button.Tag>
</Button>