在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组件返回。”
答案 0 :(得分:2)
您无法将控件作为资源。一个UI元素不能同时位于可视树的两个位置,因此将控件作为资源毫无意义。
这是一个想法,但如果您使用大量资源,我不确定它会如何表现。我快速测试了它似乎工作,但我还没有真正使用它,所以在某些情况下可能会出现一些问题。
从DataTemplate中的资源中包装Canvas,如下所示:
<DataTemplate x:Key="Item1">
<Canvas>
...
</Canvas>
</DataTemplate>
将此模板用于ContentControl的 ContentTemplate 属性,如下所示:
<DataTemplate x:Key="SomeTemplate">
...
<ContentControl ContentTemplate="{StaticResource Item1}" />
...
</DataTemplate>
希望这有帮助! :)
答案 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>