【问题标题】:Loading XAML into a control at runtime and using the control's resources在运行时将 XAML 加载到控件中并使用控件的资源
【发布时间】:2011-06-14 10:24:46
【问题描述】:

这里有很多关于在运行时加载 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 的窗口的资源。例如:

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

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

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

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

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

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    更新

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

    选择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>
    

    【讨论】:

    • 那个答案以前在这里,它不起作用。 DynamicResource 不能用于 ValueConverter。
    • 你说得对,我用两个可行的解决方案更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多