WPF模板错误 - “在'System.Windows.Baml2006.TypeConverterMarkupExtension'上提供值引发了异常。”

17

我刚开始尝试使用WPF模板与样式,但不确定我的操作是否正确。以下目标是在菜单中交替显示选项的颜色。当我仅使用<MenuChoiceEven>时,代码可以正常工作,但是当我将其复制并粘贴/重命名为“MenuChoiceOdd”中的第二个部分时,出现以下错误:

> 'System.Windows.Baml2006.TypeConverterMarkupExtension'上提供的值引发了异常。

代码示例:

<Window x:Class="WpfApplication1.Template_Testing"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Template_Testing" Height="300" Width="300">
    <Grid>
        <Grid.Resources>
            <ControlTemplate x:Key="MenuChoiceEven">
                <Border BorderThickness="1" BorderBrush="#FF4A5D80">
                <TextBlock Height="Auto" HorizontalAlignment="Stretch" Margin="0"  Width="Auto" FontSize="14" Foreground="SlateGray" TextAlignment="Left" AllowDrop="True" Text="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}">
                    <TextBlock.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="White" Offset="0" />
                            <GradientStop Color="#FFC2CCDB" Offset="1" />
                        </LinearGradientBrush>
                    </TextBlock.Background>
                </TextBlock>
                </Border>
            </ControlTemplate>
            <ControlTemplate x:Key="MenuChoiceOdd">
                <Border BorderThickness="1" BorderBrush="#FF4A5D80">
                    <TextBlock Height="Auto" HorizontalAlignment="Stretch" Margin="0"  Width="Auto" FontSize="14" Foreground="SlateGray" TextAlignment="Left" AllowDrop="True" Text="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}">
                    <TextBlock.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="White" Offset="0" />
                            <GradientStop Color="##FFCBCBCB" Offset="1" />
                        </LinearGradientBrush>
                    </TextBlock.Background>
                    </TextBlock>
                </Border>
            </ControlTemplate>            
        </Grid.Resources>
        <Border BorderBrush="SlateGray" BorderThickness="2" Margin="10" CornerRadius="10" Background="LightSteelBlue" Width="200">
            <StackPanel Margin="4">
                <TextBlock Height="Auto" HorizontalAlignment="Stretch" Margin="2,2,2,0" Name="MenuHeaderTextBlock" Text="TextBlock" Width="Auto" FontSize="16" Foreground="PaleGoldenrod" TextAlignment="Left" Padding="10" FontWeight="Bold"><TextBlock.Background><LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="LightSlateGray" Offset="0" /><GradientStop Color="DarkSlateGray" Offset="1" /></LinearGradientBrush></TextBlock.Background></TextBlock>
                <StackPanel Height="Auto" HorizontalAlignment="Stretch" Margin="2,0,2,0" Name="MenuChoicesStackPanel" VerticalAlignment="Top" Width="Auto">
                    <Button Template="{StaticResource MenuChoiceEven}" Content="Test Even menu element" />
                    <Button Template="{StaticResource MenuChoiceOdd}"  Content="Test odd menu element" />
                </StackPanel>
            </StackPanel>
        </Border>
    </Grid>
</Window>

我做错了什么?


如果异常包含行号会很方便... - Drew Noakes
13个回答

12

周一真让人郁闷...

当我从另一个控件复制并粘贴颜色字符串时,它在前缀中加入了两个"##":

<GradientStop Color="##FFCBCBCB" Offset="1" />

依旧是糟糕的错误提示。


我是WPF的新手,这个错误信息真的很可怕。 - swdev

6

和其他人一样-这个可怕的错误信息只是意味着我的xaml中有语法错误:

<CheckBox Height="" IsChecked="{Binding IsChecked, Mode=TwoWay}"  Width="80">

请注意,我没有填写高度值。

2
我的代码也类似,但是我使用了 Button Command="CommandName" 而不是 Command="{Binding Path=CommandName}"。 - Garrison Neely

4

我曾经遇到同样的错误,原因是:

<Border Margin="5" BorderBrush="Black" BorderThickness="" Width="Auto"/>

通过在BorderThickness中输入一个数字进行修复


3
在网格上分配Width="*"给了我一个错误,一开始看起来很奇怪,但它所要表达的只是标记无法转换为实际类型。

3

在我的情况下,我改变了项目名称。在我遇到这个错误之后,我重新选择了图片,并发现我还需要更改图片的资源名称。

        <Image x:Name="imgSrc" Grid.Row="1" Source="/PREV%20-%20Filter;component/Images/Subtraktive%20Farbmischung%20%28Malen%20mit%20Wasserfarben%29.jpg" />

在我的情况下,/PREV%20-%20Filter;component 需要更正为 /DSP%20-%20Filter;component。


1
当我在BorderBrush中使用Grey而不是Gray时,遇到了相同的错误。
<Setter Property="BorderBrush" Value="Grey"/>

替代

<Setter Property="BorderBrush" Value="Gray"/>

1
这是另一个错误实例以及我如何解决它的方法。
看起来这可能是由于将项目从VS2010升级到VS2012和VS2013所导致的。不确定为什么会在这里出现问题,但我猜是这样的。
我开发了一个Visual Studio向导,以自动化将项目添加到我们非常庞大的解决方案(300多个项目)中,因为我们开发人员有其他要求来帮助维护该项目。 我使用WPF制作了向导,并且在VS2010中运行良好。 我将项目升级到VS2012和VS2013后,我开始遇到此错误。 原来我的图标和图像文件的路径在某个时候被弄乱了。一旦我在XAML中直接更正了它,我就不再遇到这个错误了。
如果您需要帮助引用资源,请参考我用来纠正问题的文章:如何在XAML中引用图标资源文件

1
与其他人不同的是,我正确地使用了XAML语法。
<ImageBrush ImageSource="..\Images\previous_icon.png" />          

当我更改了我的图片时,就出现了这个错误-后来意识到我确实在文件夹中更改了图片,但忘记了在项目中包含它。
因此,尽管XAML可以在“设计”视图中显示图像,但我在运行时遇到了这个异常。 有点傻。

0

我遇到了同样的错误,但是在资源文件夹中使用了错误的路径来引用图像

我的情况是...

<controls:ImageButton Grid.Column="2" ImageButtonSource="Resources/close_normal.png"/>

但我需要这个...

<controls:ImageButton Grid.Column="2" ImageButtonSource="../Resources/close_normal.png"/>

必须在开头添加 ../ 才能先返回上一级文件夹


0

我也曾经因为忘记了花括号而遇到过同样的问题:

<DataTrigger Binding="{Binding Path=IsWhiteboardShared}" Value="True">
    <Setter Property="Background" Value="StaticResource AccentColorBlueBrush"/>
</DataTrigger>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接