在运行时将XAML加载到控件中并使用控件的资源

Tim*_*hyP 4 c# wpf xaml

关于在运行时加载XAML有很多问题,但到目前为止我可以说这不是重复.

我在运行时将XAML加载到控件中:

<ContentControl Content="{Binding Layout.View, Converter={StaticResource StringToXamlConverter}}"/>
Run Code Online (Sandbox Code Playgroud)

转换器很简单:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,在正在加载的XAML中,我需要使用ValueConverters.转换器被定义为加载XAML的Window的资源.例如:

<c:BooleanToVisibilityValueConverter x:Key="BooleanToVisibilityConverter"/>
Run Code Online (Sandbox Code Playgroud)

当然,如果我尝试使用此资源,则XamlReader.Parse()方法会抛出异常,因为在阅读时它不可用.

Visibility="{Binding Layout.TextItem1.IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}}"
Run Code Online (Sandbox Code Playgroud)

有办法解决这个问题吗?也许是告诉XamlReader忽略这个的一种方法?或者可能在这种情况下工作的ValueConverters的替代方案?

请注意,使用DynamicResource也不起作用.它们不能用于ValueConverters.

J C*_*per 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>
Run Code Online (Sandbox Code Playgroud)