【问题标题】:After a "SetterCollectionBase" is in use (sealed), it cannot be modified“SetterCollectionBase”在使用(密封)后,无法修改
【发布时间】:2009-11-06 02:14:07
【问题描述】:
<UserControl x:Class="FlowItem"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300">
<UserControl.Resources>
    <Style TargetType="Label">
        <Style.Setters>
            <Setter Property="Background" Value="AliceBlue" ></Setter>
        </Style.Setters>
    </Style>
</UserControl.Resources>
<DockPanel Height="300" Width="300" LastChildFill="False" Background="Transparent">
    <Label Height="28" DockPanel.Dock="Top"></Label>
    <Label Height="28" DockPanel.Dock="Bottom">What ever</Label>
    <Label Width="28" DockPanel.Dock="Left"></Label>
    <Label Width="28" DockPanel.Dock="Right"></Label>
</DockPanel>

如何通过样式设置标签的背景? 谢谢!

【问题讨论】:

  • 我的问题是这个 XAML 在 VS2008 中无法编译,并显示错误消息:“SetterCollectionBase”在使用(密封)后,无法修改。

标签: wpf xaml styles


【解决方案1】:

实际错误告诉我 Setter.Seal() 正在 setter 上被调用,并且后来的项目正在从该集合中添加或删除(即,调用了 Add、Insert、Remove 或 Clear)。我在您的 XAML 中看不到任何会导致这种情况的内容,并且代码对我来说编译得很好。

我创建了一个空的 VS2008 C#“WPF 应用程序”项目,将您的 XAML 作为一个松散的 XAML 文件添加到其中,没有后面的代码,并在最后添加了缺少的标签。生成的项目编译良好,我可以将 UserControl 添加到窗口并查看它。

尝试使用相同的程序。如果它适用于空项目但不适用于您的项目,请比较项目以找出导致问题的原因。以下是一些需要检查的事项:

  • 项目是否具有相同的引用?
  • 项目是否具有相同的构建设置,包括目标框架?
  • 您的常规项目是否在任何地方使用“UserControl”、“Style”、“Setter”等术语?
  • 如果您了解代码隐藏,您是否会进行常规项目?

如果您的 XAML 甚至无法在从 C# WPF 应用程序模板创建的全新空项目中运行,请检查以下事项:

  • 您是否安装了测试版软件(尤其是 VS.NET 或 NET Framework),或者您是否曾经安装过,如果有,是否已完全删除
  • 尝试使用 MSBuild 编译您的项目,看看问题是否与 IDE 有关
  • 尝试下载一个使用样式的工作 WPF 项目并对其进行编译,例如 Kevin's Bag Of Tricks (sp?)
  • 作为最后的手段,尝试重新安装 NET Framework,如果这不起作用,Visual Studio

【讨论】:

  • 我创建了一个新项目,这次成功了。我会调查一下,试着找出问题所在。非常感谢。
【解决方案2】:

您发布的代码实际上是通过样式设置标签的背景。效果很好。

我假设你正在尝试做这样的事情并且被告知 SetterCollectionBase 是密封的:

setter.Value = Brushes.Green;

要更改代码中样式设置的背景画笔,您可以在某处定义一个 DependencyProperty,并绑定到它。例如,如果您的 FlowItem 类具有 DependencyProperty“LabelBackgroundColor”,您可以将绑定设置为如下样式:

<Setter Property="Background" Value="{Binding LabelBackgoundColor, RelativeSource={RelativeSource FindAncestor, AncestorType=local:FlowItem}}" />

请注意,您还需要一个 xmlns:local= 定义。

使用声明的 DependencyProperty 和新的 setter 值,您可以在代码中执行此操作:

myFlowItem.LabelBackgroundColor = Color.Green;

一般来说,我建议不要直接在 UserControls 上创建像 LabelBackgroundColor 这样的属性。通常更好的解决方案是使用基于 FlowItem 反映目的的实际属性的触发器,例如,如果您希望在修改 FlowItem 时更改标签颜色,则可以使用“IsModified”属性。

【讨论】:

  • 奇怪的是,xaml 在我的 VS2008 中无法编译,并显示错误消息:“SetterCollectionBase”在使用(密封)后,无法修改。抱歉,如果我没有把我的问题说清楚,我认为它会编译不通。
【解决方案3】:

A 有类似的错误:“Style is in use (sealed), it cannot be modified.”

当我重建整个解决方案时,问题就解决了。

可能是 VS(我使用 2012)在源或引用中链接的一些错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多