从ControlTemplate字符串调用转换器

时间:2014-02-19 06:47:45

标签: c# wpf xaml

我正在尝试将controlTemplate绑定到generic.xaml.My中,controlTemplate中包含转换器。在绑定时,它将异常抛出为Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception

在MyView.cs

 templateString = @"<ControlTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" >
                                            <Canvas><Polygon Points=""{Binding Size,Converter={StaticResource SizeConverter}}"" Fill=""red""/></Canvas>
                                       </ControlTemplate>";

this.Template = XamlReader.Load(new System.Xml.XmlTextReader(new StringReader(templateString ))) as ControlTemplate;

在generic.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:src="clr-namespace:MySample"
                    xmlns:vsm="clr-namespace:System.Windows;assembly=PresentationFramework"
                    xmlns:srcview="clr-namespace:MySample.Views"
                    xmlns:converters="clr-namespace:MySample.Converters"
                    >
    <converters:SizeConverter x:Key="SizeConverter" />

    <Style TargetType="{x:Type srcview:MyView}">
        <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type srcview:MyView}">      
                   <Canvas>
                      <ContentControl Template="{TemplateBinding Template}" Name="contentControl" >                      
                      </ContentControl>

                   </Canvas>
               </ControlTemplate>
           </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

如何解决这个问题??

1 个答案:

答案 0 :(得分:1)

在引用它们之前未定义静态资源时,通常会遇到此问题。

对于测试,尝试使用xaml的resources部分中定义的静态资源读取xaml usercontrol。如果这样可行,那么你知道问题不在于引用转换器,而是在何时定义它。

确保转换器实际加载的更快方法是将其放在app.xaml中。这将确保在启动时加载资源字典。以下是一个例子:

<Application x:Class="TeslaFrame.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:metro="http://schemas.codeplex.com/elysium"
         >
 <Application.Resources>      
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Elysium;component/Themes/Generic.xaml"/>
            <ResourceDictionary>
                <BooleanToVisibilityConverter x:Key="globalBoolToVisConverter" />                 
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
 </Application.Resources>
</Application>