【问题标题】:XAML syntax error is blocking designer but compiling fineXAML 语法错误阻止设计器但编译正常
【发布时间】:2012-11-28 10:42:25
【问题描述】:

我遇到了一件相当奇怪的事情,我在 WPF XMAL 页面中定义了一个 DataGrid,并声明了以下内容:

<DataGrid.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF3399FF" />
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="White" />
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#FF3399FF"/>
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="White" />
</DataGrid.Resources>

从技术上讲,这两个 Inactive SystemColors 类型来自 .net 4.5,但是当它设置为目标 .net 4 时我可以编译程序,并且这些非活动画笔可以工作,但是当它设置为目标 .net 4 加载时Visual Studio 中的 XMAL 设计器页面会引发错误 The member "InactiveSelectionHighlightTextBrushKey" is not recognized or is not accessible.,然后阻止设计器视图。但它仍然按照上面程序中定义的方式编译和显示。

至少可以说这似乎非常不一致,我无法判断这是 Visual Studio 2012 的问题,还是它允许程序编译,因为我的开发计算机安装了 .net 4.5 并且它只是在更改目标框架时它看到有东西在使用它(尽管我非常怀疑)。或者是否有可能 Inactive 类型在 .net 4 中但未在文档中列为受支持,而只是在 VS 中导致此问题?

在 .net 4 中是否有更好的方法来允许我设置 DataGrid 行的非活动选择颜色?或者是升级到 .net 4.5 的唯一方法?

【问题讨论】:

  • 在没有安装 4.5 的机器上运行程序会发生什么?
  • 我希望我能测试一下,但周围没有没有 4.5 的电脑。
  • @Nzc - 该应用程序无法在没有 4.5 的机器上运行(只是在我的一个应用程序中随机遇到了这个问题,并在尝试找到解决方案时遇到了这个 SO 问题)。
  • @Scott:好吧,碰巧我们上周遇到了类似的 4.0/4.5 问题。在我们的例子中,一个线程错误。我们通过在安装程序中强制安装 4.5 来“修复”它。显然,4.5 中的更改在使用 4.0 运行时会中断,但显然没有检查 4.5 是否正在安装。
  • 我刚刚在 VS2010 中遇到了这个问题,其中使用 InactiveSelectionHighlightBrushKey 纯色画笔的 DataGrid 可以成功编译,但在执行时会崩溃。按照 Nzc 的建议,通过安装 .Net v4.5 来“修复”它(+1 他的评论)

标签: .net wpf xaml datagrid visual-studio-2012


【解决方案1】:

Visual Studio 会构建一个程序集,即使它的目标设置为 .NET FW 4.0 并且您在 XAML 代码中使用 InactiveSelectionHighlightBrushKey。此程序集将在具有 .NET FW 4.5 的系统中正确执行。但是如果系统只有.NET FW 4.0,当系统使用InactiveSelectionHighlightBrushKey创建用户控件时会抛出异常

因此,您不能在目标设置为 FW 4.0 的程序集中使用 InactiveSelectionHighlightBrushKey,因为它们无法在只有 .NET FW 4.0 的系统中工作。

要同时支持 FW 4.0 和 FW 4.5,您可以在 LostFocus/LostKeyboardFocus/GotFocus 事件的处理程序中设置所选行的颜色。见示例代码https://stackoverflow.com/a/8095932/1815957

【讨论】:

    【解决方案2】:

    如果您不想使用后面的代码,那么InactiveSelectionHighlightBrushKey 的替代方案是ControlBrushKey。以下对我有用:

    <Style x:Key="ReadOnlyDataGrid" TargetType="{x:Type DataGrid}">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightGreen"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="LightGreen"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black"/>
        </Style.Resources>
    </Style>
    

    【讨论】:

    • 不是真正的替代品,因为它为控件的背景着色而不是非活动选择。
    • ControlBrushKey 设置每个备用行以及失去焦点的行。
    • 更糟糕的是,设置ControlTextBrushKey 还会更改行和列标题的默认文本颜色。这使得它实际上毫无用处,因为除非选中,否则所有文本都会消失。 // 您还需要将 DataGrid.Foreground 显式设置为 Black 之类的东西来解决这个问题。
    • 为我工作。谢谢。
    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2012-10-23
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多