资源和内容控件模板

本文关键字:控件 资源 | 更新日期: 2023-09-27 17:56:33

在代码隐藏中将内容控件模板设置为 xaml 时,我无法访问父 xaml 中包含的静态资源。

我有一个内容控件,如下所示:

<ContentControl x:Name="ccMaterial">
  <ContentControl.Resources>
    <x:Array x:Key="BondListKey" Type="sys:Int32" 
             xmlns:sys="clr-namespace:System;assembly=mscorlib" />
  </ContentControl.Resources> 
</ContentControl>

然后在代码隐藏中,我按如下方式设置模板:

   string template = "<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
     "<ComboBox Grid.Column='"1'" Grid.Row='"0'" ItemsSource='"{Binding Source={StaticResource BondListKey}}'"  />" +
"</ControlTemplate>";
ccMaterial.Template = (ControlTemplate)XamlReader.Parse(template);

问题是,当我尝试运行它时,我收到异常,指出找不到资源"BondListKey"。谁能解释为什么?

如果您需要更多信息,请告诉我。

回应约翰斯的评论:

我有一个选项卡项,我希望能够根据窗体上其他位置的用户选择在该选项卡中显示不同的控件。例如,如果用户选择了一辆车,我希望能够更改控制模板以包含发动机尺寸、燃料类型等的文本框,如果用户选择了橙色,我想要一个包含多样性和甜度的控制模板。 我怀疑我可以通过在选项卡上绘制所有可能的控件,然后根据数据触发器更改相关控件的可见/启用状态来获得此功能,但这可能涉及大量过滤控件(因为可能有很多用户选择类型)。理想情况下,我希望能够做的是将所需的控件模板作为字符串提供,解析并分配给控件的模板,从而在运行时修改其内容。

如果这没有意义,或者您需要任何澄清:),请告诉我

资源和内容控件模板

StaticResource 是一种在加载时执行一次的静态查找。如果当时找不到目标资源,则会收到一个错误,即你现在看到的错误。由于在 XamlReader 的上下文中加载模板,因此 XAML 中的资源不可用。在大多数情况下,解决方法是改用 DynamicResource 来提供默认值,该值在资源可用时更新,但绑定源不是依赖项属性,因此不能使用动态。

无需使用 XamlReader,只需在 XAML 中声明 XAML,并利用其中可用的上下文:

<ContentControl x:Name="ccMaterial">
    <ContentControl.Resources>
        <x:Array x:Key="BondListKey" Type="sys:Int32"
             xmlns:sys="clr-namespace:System;assembly=mscorlib" />
        <ControlTemplate x:Key="MyTemplate">
            <ComboBox Grid.Column="1" Grid.Row="0" ItemsSource="{Binding Source={StaticResource BondListKey}}"  />
        </ControlTemplate>
    </ContentControl.Resources>
</ContentControl>

然后,您仍然可以使用以下方法从代码加载:

ccMaterial.Template = ccMaterial.FindResource("MyTemplate") as ControlTemplate;