Wpf Xaml VS designer错误:';{dependencProperty.UnsetValue}';

Wpf Xaml VS designer错误:';{dependencProperty.UnsetValue}';,wpf,xaml,Wpf,Xaml,我正在使用模板绑定构建一个自定义选项卡项。一切都很好,直到我在边距上使用了到自定义值转换器的绑定,然后我在VS设计器中得到一个错误: “{DependencyProperty.UnsetValue}”不是Setter上“System.Windows.Controls.Control.Template”属性的有效值 转换器如下所示: public class ContentToMarginConverter : IValueConverter { #region IValueConvert

我正在使用模板绑定构建一个自定义选项卡项。一切都很好,直到我在边距上使用了到自定义值转换器的绑定,然后我在VS设计器中得到一个错误: “{DependencyProperty.UnsetValue}”不是Setter上“System.Windows.Controls.Control.Template”属性的有效值

转换器如下所示:

public class ContentToMarginConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return new Thickness(0, 0, -((ContentPresenter)value).ActualHeight, 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
public class ContentToPathConverter :  IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var ps = new PathSegmentCollection(4);
        ContentPresenter cp = (ContentPresenter)value;
        double h = cp.ActualHeight > 10 ? 1.4 * cp.ActualHeight : 10;
        double w = cp.ActualWidth > 10 ? 1.25 * cp.ActualWidth : 10;
        ps.Add(new LineSegment(new Point(1, 0.7 * h), true));
        ps.Add(new BezierSegment(new Point(1, 0.9 * h), new Point(0.1 * h, h), new Point(0.3 * h, h), true));
        ps.Add(new LineSegment(new Point(w, h), true));
        ps.Add(new BezierSegment(new Point(w + 0.6 * h, h), new Point(w + h, 0), new Point(w + h * 1.3, 0), true));
        return ps;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
<Style TargetType="TabItem">
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TabItem">
                        <Grid Name="grd">                                                   
                            <Path Name="tabPath" 
                                  StrokeThickness="1"
                                  Stroke="{StaticResource ResourceKey=borderBrush}"
                                  Fill="{StaticResource ResourceKey=unselectedBrush}"
                                  Margin="{Binding ElementName=TabItemContent,Converter={StaticResource ResourceKey=content2Margin}}">
                                <Path.Data>
                                    <PathGeometry>
                                        <PathFigure IsClosed="False" StartPoint="1,0"
                                                    Segments="{Binding ElementName=TabItemContent,Converter={StaticResource ResourceKey=content2Path}}">
                                            </PathFigure>        
                                    </PathGeometry>
                                </Path.Data>
                                <Path.LayoutTransform>
                                    <ScaleTransform ScaleY="-1"/>
                                </Path.LayoutTransform>
                            </Path>                                                                                                                
                            <Rectangle Name="TabItemTopBorder" Height="2" Visibility="Visible"
                                   VerticalAlignment="Bottom"
                                   Margin="{Binding ElementName=TabItemContent, Converter={StaticResource ResourceKey=content2Margin}}" />
                            <ContentPresenter Name="TabItemContent" ContentSource="Header"
                                          Margin="10,2,10,2" VerticalAlignment="Center"
                                          TextElement.Foreground="White"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True" SourceName="grd">
                                <Setter Property="Stroke" Value="{StaticResource HoverBrush}" TargetName="tabPath"/>
                            </Trigger>
                            <Trigger Property="Selector.IsSelected" Value="True">
                                <Setter Property="Fill" TargetName="tabPath" Value="{StaticResource ResourceKey=backgroundBrush}"/>                                                                   
                                <Setter Property="Panel.ZIndex" Value="2"/>
                                <Setter Property="Visibility" Value="Hidden" TargetName="TabItemTopBorder"/>
                                <Setter Property="TextElement.Foreground" TargetName="TabItemContent" Value="Black"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
以及xaml模板,如下所示:

public class ContentToMarginConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return new Thickness(0, 0, -((ContentPresenter)value).ActualHeight, 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
public class ContentToPathConverter :  IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var ps = new PathSegmentCollection(4);
        ContentPresenter cp = (ContentPresenter)value;
        double h = cp.ActualHeight > 10 ? 1.4 * cp.ActualHeight : 10;
        double w = cp.ActualWidth > 10 ? 1.25 * cp.ActualWidth : 10;
        ps.Add(new LineSegment(new Point(1, 0.7 * h), true));
        ps.Add(new BezierSegment(new Point(1, 0.9 * h), new Point(0.1 * h, h), new Point(0.3 * h, h), true));
        ps.Add(new LineSegment(new Point(w, h), true));
        ps.Add(new BezierSegment(new Point(w + 0.6 * h, h), new Point(w + h, 0), new Point(w + h * 1.3, 0), true));
        return ps;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
<Style TargetType="TabItem">
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TabItem">
                        <Grid Name="grd">                                                   
                            <Path Name="tabPath" 
                                  StrokeThickness="1"
                                  Stroke="{StaticResource ResourceKey=borderBrush}"
                                  Fill="{StaticResource ResourceKey=unselectedBrush}"
                                  Margin="{Binding ElementName=TabItemContent,Converter={StaticResource ResourceKey=content2Margin}}">
                                <Path.Data>
                                    <PathGeometry>
                                        <PathFigure IsClosed="False" StartPoint="1,0"
                                                    Segments="{Binding ElementName=TabItemContent,Converter={StaticResource ResourceKey=content2Path}}">
                                            </PathFigure>        
                                    </PathGeometry>
                                </Path.Data>
                                <Path.LayoutTransform>
                                    <ScaleTransform ScaleY="-1"/>
                                </Path.LayoutTransform>
                            </Path>                                                                                                                
                            <Rectangle Name="TabItemTopBorder" Height="2" Visibility="Visible"
                                   VerticalAlignment="Bottom"
                                   Margin="{Binding ElementName=TabItemContent, Converter={StaticResource ResourceKey=content2Margin}}" />
                            <ContentPresenter Name="TabItemContent" ContentSource="Header"
                                          Margin="10,2,10,2" VerticalAlignment="Center"
                                          TextElement.Foreground="White"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True" SourceName="grd">
                                <Setter Property="Stroke" Value="{StaticResource HoverBrush}" TargetName="tabPath"/>
                            </Trigger>
                            <Trigger Property="Selector.IsSelected" Value="True">
                                <Setter Property="Fill" TargetName="tabPath" Value="{StaticResource ResourceKey=backgroundBrush}"/>                                                                   
                                <Setter Property="Panel.ZIndex" Value="2"/>
                                <Setter Property="Visibility" Value="Hidden" TargetName="TabItemTopBorder"/>
                                <Setter Property="TextElement.Foreground" TargetName="TabItemContent" Value="Black"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>


我在设计器中出现此错误的任何原因,但当我构建项目时,一切正常???

设计器基本上会对在设计视图中显示内容所需的内容进行预编译

这可能会引起一些问题

如果重建解决方案不起作用,下一个最好的方法是检测设计器模式并绕过转换器。基本上具有if(isdesignmode)返回;在Convert方法的顶部


有关如何在此处执行此操作的更多信息

设计师基本上会对在设计视图中显示内容所需的内容进行预编译

这可能会引起一些问题

如果重建解决方案不起作用,下一个最好的方法是检测设计器模式并绕过转换器。基本上具有if(isdesignmode)返回;在Convert方法的顶部


有关如何执行此操作的更多信息,请参见此处

我遇到了类似的错误。我的问题是因为我在样式定义中同时使用了x:Key=“keyName”和x:Name=“keyName”进行了定义。通过删除“x:Name='keyName'”,为我解决了这个问题。

我也遇到了类似的错误。我的问题是因为我在样式定义中同时使用了x:Key=“keyName”和x:Name=“keyName”进行了定义。通过删除“x:Name='keyName'”,为我解决了这个问题。

我也遇到了类似的错误。我的转换器在单独的程序集中定义。 我尝试重建解决方案,重新启动Visual Studio,。。。设计师仍然没有工作。
但是在删除所有文件(包括源文件和输出文件)后,再次获取源文件并生成解决方案,问题得到了解决。

我也遇到了类似的错误。我的转换器在单独的程序集中定义。 我尝试重建解决方案,重新启动Visual Studio,。。。设计师仍然没有工作。
但是在删除所有文件(包括源文件和输出文件)后,再次获取源文件并生成解决方案,问题得到了解决。

设计器出现问题的情况并不少见,但在运行时也不例外。您的两个自定义iValueConverter都有问题,还是只有其中一个有问题?设计器出现问题并不少见,但在运行时也不例外。您的两个自定义转换器都有问题,还是只是其中一个?