5

为什么这行不通?

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

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

<Setter Property="ChromeContent">
  <Setter.Value>
    <Grid />
  </Setter.Value>
</Setter>

...

后来,在控制模板中...

<ContentPresenter Grid.Column="0" 
     x:Name="ChromeContentPresenter" 
     Content="{TemplateBinding ChromeContent}" />

这是 ChromeContent 的依赖属性...

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):_Failed to assign to property 'System.Windows.Controls.ContentPresenter.Content'

奇怪的是,如果我从设置器中删除 Grid 并且只使用文本,则以下内容将正常工作:

<Setter Property="ChromeContent" Value="DEFAULT" />

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

  Grid g = new Grid();
  g.Width = 100;
  g.Height = 25;
  g.Background = new SolidColorBrush(Colors.LightGray);
  ChromeContent = g;

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

非常感谢您的帮助!

4

1 回答 1

6

这就是问题:-

<Setter Property="ChromeContent">
  <Setter.Value>
    <Grid />
  </Setter.Value>
</Setter>

您不应将 aUIElement直接包含在资源字典中或作为样式的值。您可能会将样式视为某种描述符,但事实并非如此。样式中的值是它们所持有的对象的构造实例。您的样式包含一个Grid. 每当使用该样式分配给ChromeContent属性时,它将尝试分配 Grid 的相同单个实例。

AUIElement只能是一个父母的孩子。如果你的控件被构造了两个实例会发生什么?将(如果 silverlight 允许您)尝试将 Grid 的相同单个实例分配给两个控件。

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

编辑

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

<Setter Property="ChromeContentTemplate">
  <Setter.Value>
    <DataTemplate>
      <Grid />
    </DataTemplate>
  </Setter.Value>
</Setter>

财产:-

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);

控制模板:-

<ContentPresenter Grid.Column="0" 
     x:Name="ChromeContentPresenter" 
     Content="{TemplateBinding ChromeContent}"
     ContentTemplate="{TemplateBinding ChromeContentTemplate" />
于 2011-01-28T17:15:59.847 回答