为什么这个不行?
在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):将属性'System.Windows.Controls.ContentPresenter.Content‘分配给_Failed
奇怪的是,如果我从setter中删除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中定义的网格的默认内容工作。有人知道这件事吗?
非常感谢您的帮助!
发布于 2011-01-28 17:15:59
这就是问题所在:
<Setter Property="ChromeContent">
<Setter.Value>
<Grid />
</Setter.Value>
</Setter>不应将UIElement直接包含在资源字典中或作为样式的值。您可能认为样式是某种描述符,但它不是。样式中的值是它们所持有的对象的构造实例。您的样式包含Grid的一个实例。每当使用该样式分配给ChromeContent属性时,它都会尝试对网格的同一个单个实例进行访问。
UIElement只能是父级的子级。如果您的控制被构造了两个实例,会发生什么?会有(如果silverlight允许的话)尝试将网格的同一个单个实例分配给两个控件。
这是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" />https://stackoverflow.com/questions/4829550
复制相似问题