gpt4 book ai didi

c# - WPF:无法在属性元素怪异上设置属性

转载 作者:可可西里 更新时间:2023-11-01 09:03:42 26 4
gpt4 key购买 nike

private TextBlock _caption = new TextBlock();

public TextBlock Caption
{
get { return _caption; }
set { _caption = value; }
}

<l:CustomPanel>
<l:CustomPanel.Caption Text="Caption text" FontSize="18" Foreground="White" />
</l:CustomPanel>

给我以下错误:
无法在属性元素上设置属性。

如果我使用:

<l:CustomPanel>  
<l:CustomPanel.Caption>
<TextBlock Text="Caption text" FontSize="18" Foreground="White" />
</l:CustomPanel.Caption>
</l:CustomPanel>

我的 TextBlock 显示正常,但它像这样嵌套在另一个 TextBlock 中,它甚至似乎将自己添加到 Caption 属性之外:

<l:CustomPanel>  
<l:CustomPanel.Caption>
<TextBlock>
<InlineUIContainer>
<TextBlock Text="Caption text" FontSize="18" Foreground="White" />
</InlineUIContainer>
</TextBlock>
</l:CustomPanel.Caption>

<TextBlock>
<InlineUIContainer>
<TextBlock Text="Caption text" FontSize="18" Foreground="White" />
</InlineUIContainer>
</TextBlock>
</l:CustomPanel>

您可能已经猜到,如果可能的话,我希望我的代码在自定义面板上通过 XAML 设置我的标题属性。

我也尝试过使用 DependencyProperty 的相同代码,但无济于事。

那么,有人可以帮我解决这个问题吗?

最佳答案

我可以解释出了什么问题以及如何解决它。

首先,

<l:CustomPanel>
<l:CustomPanel.Caption Text="Caption text" FontSize="18" Foreground="White" />

是一个简单的语法错误。 <l:CustomPanel.Caption>语法不接受 XML 属性 - 属性值必须在元素内。

这是正确的属性元素语法:

<l:CustomPanel>    
<l:CustomPanel.Caption>
<TextBlock Text="Caption text" FontSize="18" Foreground="White" />
</l:CustomPanel.Caption>
</l:CustomPanel>

但是:

  1. 属性元素语法仅适用于 DependencyProperties(因此它不适用于您的 CLR 属性)和
  2. 属性元素语法始终遵循属性类型的 ContentPropertyAttribute

由于 TextBlock 有一个 [ContentPropertyAttribute("Inlines")],属性元素语法试图将 TextBlock 添加到 Inlines 集合。

解决方案很简单:将您的属性声明为 UIElement 类型的 DependencyProperty 而不是 TextBlock 类型。这具有不将内容显示限制为仅 TextBlock 的额外优势。如果您真的想将其限制为仅一个 TextBlock,您可以使用验证回调。

public UIElement Content { get { ...
public static readonly DependencyProperty ContentProperty = ...

关于c# - WPF:无法在属性元素怪异上设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1553780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com