我正在使用模板绑定构建自定义tabitem。一切都很好,直到我使用自定义值转换器的边距绑定,然后我在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
}
xaml模板如下:
<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>
我在设计师中遇到此错误的原因,但是当我构建项目时很好????
答案 0 :(得分:1)
我尝试检查自定义转换器中的设计时标志,但这不起作用。我设法通过改变路径图被绑定到转换器的方式来实现这一点,如下所示 How to create trapezoid tabs in WPF tab control
答案 1 :(得分:1)
我也有类似的错误。我的转换器在单独的程序集中定义。 我尝试重建解决方案,重新启动Visual Studio,......设计师仍然没有工作。 但删除所有文件(包括源文件和输出文件)后,再次获取源文件并构建解决方案,问题已解决。
答案 2 :(得分:0)
设计师基本上会预先编译在设计视图中显示内容所需的内容。
这可能会导致问题。
如果重建解决方案不起作用,那么下一个最好的方法是检测设计器模式并绕过转换器。基本上有一个if(isdesignmode)返回;在Convert方法的顶部。
有关如何执行此操作的详细信息How to force Visual Studio 2010 to ignore a WPF XAML declared DataContext at design time?
答案 3 :(得分:0)
我有类似的错误。我的问题是因为我在样式定义中使用x:Key =“keyName”和x:Name =“keyName”定义的。通过删除“x:Name ='keyName'”,解决了我的问题。