2012-12-10 50 views
9

我碰到一个相当奇特的事情发生,我有一个WPF XMAL页面中定义一个DataGrid具有以下声明:XAML语法错误阻止设计师,但编译罚款

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

技术上两个InactiveSystemColors类型与.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?

+0

什么发生在你的机器上运行您的程序没有安装4.5? – Nzc

+0

我希望我可以测试这个,但没有一个计算机周围没有4.5。 –

+0

@Nzc - 应用程序无法在没有4.5的机器上运行(只是在我的一个应用程序中随机遇到此问题,并在尝试查找解决方案时遇到此SO问题)。 – Scott

回答

15

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和4.5 FW可以设置选定行的颜色在LostFocus/LostKeyboardFocus/GotFocus事件处理程序。请参阅示例代码https://stackoverflow.com/a/8095932/1815957

+0

这真的很好知道,谢谢你的洞察力。 –

9

如果您不想使用代码,那么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> 
+2

不是真正的替代品,因为它为控件的背景添加颜色,而不是非活动的选择。 –

+0

ControlBrushKey设置每个备用行以及失去焦点的行。 – David

+1

更糟糕的是,对于行和列标题,设置ControlTextBrushKey还会更改默认的文本颜色。这实际上是无用的,因为除非被选中,所有的文字都会消失。 //你还需要明确地将DataGrid.Foreground设置为像Black这样的东西来解决这个问题。 – ygoe

相关问题