首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >银灯默认ContentPresenter含量

银灯默认ContentPresenter含量
EN

Stack Overflow用户
提问于 2011-01-28 14:52:37
回答 1查看 1.5K关注 0票数 5

为什么这个不行?

在generic.xaml中用于自定义控件:

在应用于自定义控件的样式中。

代码语言:javascript
复制
<Setter Property="ChromeContent">
  <Setter.Value>
    <Grid />
  </Setter.Value>
</Setter>

..。

稍后,在控制模板中..。

代码语言:javascript
复制
<ContentPresenter Grid.Column="0" 
     x:Name="ChromeContentPresenter" 
     Content="{TemplateBinding ChromeContent}" />

以下是ChromeContent的依赖项属性..。

代码语言:javascript
复制
public Object ChromeContent
{
  get { return (Object)GetValue(ChromeContentProperty); }
  set { SetValue(ChromeContentProperty, value); }
}
public static readonly DependencyProperty ChromeContentProperty =
    DependencyProperty.Register("ChromeContent", typeof(Object), 
    typeof(casPopup), null);

正如你所看到的,它需要任何物体。我试着把它改成网格,但这没有帮助。

它抛出此错误(来自javascript):将属性'System.Windows.Controls.ContentPresenter.Content‘分配给_Failed

奇怪的是,如果我从setter中删除Grid并只使用文本,下面的内容就会正常工作:

代码语言:javascript
复制
<Setter Property="ChromeContent" Value="DEFAULT" />

此外,这也适用于控件类中的OnApplyTemplate方法:

代码语言:javascript
复制
  Grid g = new Grid();
  g.Width = 100;
  g.Height = 25;
  g.Background = new SolidColorBrush(Colors.LightGray);
  ChromeContent = g;

我很难理解是什么阻止了在generic.xaml中定义的网格的默认内容工作。有人知道这件事吗?

非常感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-28 17:15:59

这就是问题所在:

代码语言:javascript
复制
<Setter Property="ChromeContent">
  <Setter.Value>
    <Grid />
  </Setter.Value>
</Setter>

不应将UIElement直接包含在资源字典中或作为样式的值。您可能认为样式是某种描述符,但它不是。样式中的值是它们所持有的对象的构造实例。您的样式包含Grid的一个实例。每当使用该样式分配给ChromeContent属性时,它都会尝试对网格的同一个单个实例进行访问。

UIElement只能是父级的子级。如果您的控制被构造了两个实例,会发生什么?会有(如果silverlight允许的话)尝试将网格的同一个单个实例分配给两个控件。

这是ControlTemplateDataTemplate等模板的原因之一。每次使用模板时都会调用其中的标记,而不是在首次解析Xaml时调用该标记。

编辑

若要回答您的补充问题,您应该默认DataTemplate类型的另一个属性:-

代码语言:javascript
复制
<Setter Property="ChromeContentTemplate">
  <Setter.Value>
    <DataTemplate>
      <Grid />
    </DataTemplate>
  </Setter.Value>
</Setter>

财产:-

代码语言:javascript
复制
public Object ChromeContentTemplate
{
  get { return (DataTemplate)GetValue(ChromeContentTemplateProperty); }
  set { SetValue(ChromeContentTemplateProperty, value); }
}

public static readonly DependencyProperty ChromeContentTemplateProperty=
    DependencyProperty.Register("ChromeContentTemplate", typeof(DataTemplate), 
    typeof(casPopup), null);

控制模板:-

代码语言:javascript
复制
<ContentPresenter Grid.Column="0" 
     x:Name="ChromeContentPresenter" 
     Content="{TemplateBinding ChromeContent}"
     ContentTemplate="{TemplateBinding ChromeContentTemplate" />
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4829550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档