首页 > 解决方案 > 目标类型与元素类型不匹配,控件不会显示在设计器中

问题描述

我们有一些具有自己的样式、模板的自定义控件。基本上是这样的:(我将在最后发布完整的样式/模板)

public class CustomBtn : Button
{
 public propdp DependencyProp1...
 public propdp DependencyProp2...
 ...
}

 <Style x:Key="XStyle.CustomBtnStyle" TargetType="{x:Type cc:CustomBtn}">
  ...
  <Setter Property="Template" Value="{StaticResource XControlTemplate.CustomButton}"/>


<ControlTemplate x:Key="XControlTemplate.CustomButton" TargetType="{x:Type cc:CustomBtn}">
...

定义的一些属性在模板中使用,一些在样式中使用。

我们一直面临的问题是这些控件不会显示在设计器中(大部分时间),而是显示为好像它们已损坏。错误为“目标类型与元素类型不匹配”

在此处输入图像描述

在此处输入图像描述


<Style x:Key="XStyle.ButtonIcon.Action" TargetType="{x:Type cc:ButtonIcon}">
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    <Setter Property="Height" Value="{StaticResource XDouble.Height.Button.Default}"/>
    <Setter Property="Template" Value="{StaticResource XControlTemplate.ButtonIcon.Action}"/>
    <Setter Property="IconSize" Value="30"/>
    <Setter Property="GradientPercentage" Value="0.0"/>
    <Setter Property="IconGeometry" Value="{x:Null}"/>
    <Setter Property="FontSize" Value="{StaticResource XDouble.FontSize.Header3}"/>
    <Setter Property="Foreground" Value="{Binding VisualTheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type cc:ButtonIcon}}, Converter={rconv:VisualThemeToForegroundConverter}}"/>
    <Setter Property="BorderBrush" Value="{StaticResource XBrush.Frame}"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Style.Triggers>
        <Trigger Property="VisualTheme" Value="ListItem">
            <Setter Property="BorderThickness" Value="{StaticResource XThickness.Border.Frame}"/>
        </Trigger>
        <Trigger Property="VisualTheme" Value="DarkOnLight">
            <Setter Property="BorderThickness" Value="{StaticResource XThickness.Border.Frame}"/>
        </Trigger>
    </Style.Triggers>
</Style>

<ControlTemplate x:Key="XControlTemplate.ButtonIcon.Action" TargetType="{x:Type cc:ButtonIcon}">
    <Border
        x:Name="OuterBorder"
        Width="{TemplateBinding Width}"
        Height="{TemplateBinding Height}"
        BorderBrush="{TemplateBinding BorderBrush}"
        Padding="10,0" 
        BorderThickness="{TemplateBinding BorderThickness}"
        CornerRadius="{StaticResource XCornerRadius.Frame}">
        <Border.Background>
            <MultiBinding Converter="{rconv:PercentageToBrushConverter}">
                <Binding Path="GradientPercentage" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type cc:ButtonIcon}}" />
                <Binding Path="VisualTheme" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type cc:ButtonIcon}}" />
            </MultiBinding>
        </Border.Background>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition x:Name="IconColumn" Width="Auto" />
                <ColumnDefinition x:Name="SpacerColumn" Width="10" />
                <ColumnDefinition x:Name="CaptionColumn" Width="*" />
            </Grid.ColumnDefinitions>
            <Border
                x:Name="IconBorder"
                Width="{TemplateBinding IconSize}"
                Height="{TemplateBinding IconSize}"
                HorizontalAlignment="Center"
                VerticalAlignment="Center">
                <Path
                    x:Name="IconPart"
                    Data="{TemplateBinding IconGeometry}"
                    Fill="{TemplateBinding Foreground}"
                    RenderTransformOrigin="{Binding Path=IconRenderTransformOrigin, RelativeSource={RelativeSource TemplatedParent}}"
                    Stretch="Uniform">
                    <Path.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform
                                CenterX="{Binding Path=IconScaleCenterX, RelativeSource={RelativeSource TemplatedParent}}"
                                CenterY="{Binding Path=IconScaleCenterY, RelativeSource={RelativeSource TemplatedParent}}"
                                ScaleX="{Binding Path=IconScaleX, RelativeSource={RelativeSource TemplatedParent}}"
                                ScaleY="{Binding Path=IconScaleY, RelativeSource={RelativeSource TemplatedParent}}" />
                            <RotateTransform 
                                Angle="{Binding Path=IconRotationAngle, RelativeSource={RelativeSource TemplatedParent}}" 
                                CenterX="{Binding Path=IconRotationCenterX, RelativeSource={RelativeSource TemplatedParent}}" 
                                CenterY="{Binding Path=IconRotationCenterY, RelativeSource={RelativeSource TemplatedParent}}" />
                        </TransformGroup>
                    </Path.RenderTransform>
                </Path>
            </Border>
            <ContentPresenter
                x:Name="ContentPresenter"
                Grid.Column="2"
                HorizontalAlignment="Left"
                VerticalAlignment="Center"
                Content="{TemplateBinding Caption}"
                Focusable="False"
                SnapsToDevicePixels="True"
                TextBlock.FontSize="{TemplateBinding FontSize}"
                TextBlock.Foreground="{TemplateBinding Foreground}"/>
        </Grid>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Opacity" Value="{StaticResource XDouble.Opacity.Disabled}" />
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard x:Name="StoryBoardMouseEnter" Storyboard="{StaticResource XStoryboard.DoubleAnimation.GradientPercentage.RunUp}" />
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard x:Name="StoryBoardMouseLeave" Storyboard="{StaticResource XStoryboard.DoubleAnimation.GradientPercentage.RunDown}" />
            </Trigger.ExitActions>
        </Trigger>
        <Trigger Property="Caption" Value="{x:Null}">
            <Setter TargetName="ContentPresenter" Property="Visibility" Value="Collapsed" />
            <Setter TargetName="IconColumn" Property="Width" Value="*" />
            <Setter TargetName="SpacerColumn" Property="Width" Value="0" />
            <Setter TargetName="CaptionColumn" Property="Width" Value="0" />
        </Trigger>
        <Trigger Property="Caption" Value="">
            <Setter TargetName="ContentPresenter" Property="Visibility" Value="Collapsed" />
            <Setter TargetName="IconColumn" Property="Width" Value="*" />
            <Setter TargetName="SpacerColumn" Property="Width" Value="0" />
            <Setter TargetName="CaptionColumn" Property="Width" Value="0" />
        </Trigger>
        <Trigger Property="IconGeometry" Value="{x:Null}">
            <Setter TargetName="IconPart" Property="Visibility" Value="Collapsed"/>
            <Setter TargetName="SpacerColumn" Property="Width" Value="0"/>
            <Setter TargetName="IconColumn" Property="Width" Value="0"/>
            <Setter TargetName="ContentPresenter" Property="Grid.Column" Value="0"/>
            <Setter TargetName="ContentPresenter" Property="Grid.ColumnSpan" Value="3"/>
            <Setter TargetName="ContentPresenter" Property="HorizontalAlignment" Value="Center"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

标签: wpfxaml

解决方案


推荐阅读