繁体   English   中英

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

[英]Loading XAML into a control at runtime and using the control's resources

这里有很多关于在运行时加载 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。 转换器定义为 Window 的资源,其中加载了 XAML。 例如:

<c:BooleanToVisibilityValueConverter x:Key="BooleanToVisibilityConverter"/>

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

Visibility="{Binding Layout.TextItem1.IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}}"

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

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

更新

好的,你是对的,动态资源将不起作用。 我想出了两个解决方案,最好的部分是,我已经测试过,两者都可以正常工作。

选择1:在应用资源app.xaml中定义static资源

选择 2:不要为转换器使用 static 资源,只需在 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM