Xaml - 如何将Canvas StaticResource注入DataTemplate

时间:2014-06-04 12:24:14

标签: wpf xaml windows-phone-8 windows-phone

在Windows Phone 8上,我有一些画布项StaticResources,我想将其注入DataTemplate,但无法弄清楚如何操作。

有人能指出我正确的方向吗?到目前为止,这是我的XAML的简化版本:

<phone:PhoneApplicationPage.Resources>

    <Canvas x:Key="Item1">
        ...
    </Canvas>

    <Canvas x:Key="Item2">
        ...
    </Canvas>

    <DataTemplate x:Key="SomeTemplate">
        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <Viewbox Height="96" Width="96" Margin="0,12,12,0">
                <ContentControl Content="{StaticResource Item1}" />
            </Viewbox>
        </StackPanel>
    </DataTemplate>

</phone:PhoneApplicationPage.Resources>

运行时,我得到一个未处理的例外: “错误HRESULT E_FAIL已从调用COM组件返回。”

3 个答案:

答案 0 :(得分:2)

您无法将控件作为资源。一个UI元素不能同时位于可视树的两个位置,因此将控件作为资源毫无意义。

这是一个想法,但如果您使用大量资源,我不确定它会如何表现。我快速测试了它似乎工作,但我还没有真正使用它,所以在某些情况下可能会出现一些问题。

  1. 从DataTemplate中的资源中包装Canvas,如下所示:

    <DataTemplate x:Key="Item1">
        <Canvas>
            ...
        </Canvas>
    </DataTemplate>
    
  2. 将此模板用于ContentControl的 ContentTemplate 属性,如下所示:

    <DataTemplate x:Key="SomeTemplate">
        ...
           <ContentControl ContentTemplate="{StaticResource Item1}" />
        ...
    </DataTemplate>
    
  3. 希望这有帮助! :)

答案 1 :(得分:1)

你似乎对WPF的运作方式感到有些困惑。您无法从资源中将 Canvas控件注入XAML。您可以做的最好的事情是为Style创建Canvas,然后将Style应用于XAML中的新Canvas。但是,应该注意的是,您无法从Canvas.Children设置Style属性...这会导致错误:

<Style TargetType="{x:Type Canvas}">
    <Setter Property="Children">
        <Setter.Value>
            <Button Content="Click me!!" />
        </Setter.Value>
    </Setter>
</Style>

但是, 可以在Style中“预定义”控件,但您必须使用ContentControl来显示它。试试这个:

<Style TargetType="{x:Type ContentControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContentControl}">
                <Canvas>
                    <Button Content="Click me!!" />
                </Canvas>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在,只要您使用此XAML,就可以在Button中看到Canvas

<ContentControl />

答案 2 :(得分:0)

试试这个:

    <Grid>
        <Canvas Margin="10" Background="AliceBlue">
            <ItemsControl ItemsSource="{Binding}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Canvas>
                            <TextBlock Canvas.Left="{Binding Left}" Canvas.Top="{Binding Top}" Text="{Binding Text}" Width="50" Height="20" Foreground="Black"/>
                        </Canvas>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Canvas>
    </Grid>