Wpf 目标类型与元素的类型不匹配,控件将不会显示在设计器中
我们有一些自定义控件,它们有自己的样式和模板。基本上是这样的:(我将在最后发布完整的样式/模板) }Wpf 目标类型与元素的类型不匹配,控件将不会显示在设计器中,wpf,xaml,Wpf,Xaml,我们有一些自定义控件,它们有自己的样式和模板。基本上是这样的:(我将在最后发布完整的样式/模板) } public class CustomBtn : Button { public propdp DependencyProp1... public propdp DependencyProp2... ... } <Style x:Key="XStyle.CustomBtnStyle" TargetType="{x:Type cc:Custo
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}">
...
// Using a DependencyProperty as the backing store for VisualTheme. This enables animation, styling, binding, etc...
public static readonly DependencyProperty VisualThemeProperty =
DependencyProperty.Register("VisualTheme", typeof(EVisualTheme), typeof(ButtonIcon), new PropertyMetadata(EVisualTheme.Common));
// Icon for Button
public Geometry IconGeometry
{
get { return (Geometry)GetValue(IconGeometryProperty); }
set { SetValue(IconGeometryProperty, value); }
}
// Using a DependencyProperty as the backing store for IconGeometry. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconGeometryProperty =
DependencyProperty.Register("IconGeometry", typeof(Geometry), typeof(ButtonIcon), new PropertyMetadata(new PathGeometry()));
public double IconSize
{
get { return (double)GetValue(IconSizeProperty); }
set { SetValue(IconSizeProperty, value); }
}
// Using a DependencyProperty as the backing store for IconSize. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconSizeProperty =
DependencyProperty.Register("IconSize", typeof(double), typeof(ButtonIcon), new PropertyMetadata(40.0));
// Text to be set on Button
public object Caption
{
get { return (object)GetValue(CaptionProperty); }
set { SetValue(CaptionProperty, value); }
}
// Using a DependencyProperty as the backing store for Caption. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CaptionProperty =
DependencyProperty.Register("Caption", typeof(object), typeof(ButtonIcon), new PropertyMetadata(null));
// For running Animations from 0 to 1 in order to change Animation property during Runtime (see examples of usage in code)
public double GradientPercentage
{
get { return (double)GetValue(GradientPercentageProperty); }
set { SetValue(GradientPercentageProperty, value); }
}
// Using a DependencyProperty as the backing store for GradientPercentage. This enables animation, styling, binding, etc...
public static readonly DependencyProperty GradientPercentageProperty =
DependencyProperty.Register("GradientPercentage", typeof(double), typeof(ButtonIcon), new PropertyMetadata(0.0));
public Point IconRenderTransformOrigin
{
get { return (Point)GetValue(IconRenderTransformOriginProperty); }
set { SetValue(IconRenderTransformOriginProperty, value); }
}
// Using a DependencyProperty as the backing store for IconRenderTransformOrigin. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconRenderTransformOriginProperty =
DependencyProperty.Register("IconRenderTransformOrigin", typeof(Point), typeof(ButtonIcon), new PropertyMetadata(new Point(0.5, 0.5)));
// Angle at which to rotate Icon
public double IconRotationAngle
{
get { return (double)GetValue(IconRotationAngleProperty); }
set { SetValue(IconRotationAngleProperty, value); }
}
// Using a DependencyProperty as the backing store for IconRotationAngle. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconRotationAngleProperty =
DependencyProperty.Register("IconRotationAngle", typeof(double), typeof(ButtonIcon), new PropertyMetadata(0.0));
// CenterX for Icon rotation
public double IconRotationCenterX
{
get { return (double)GetValue(IconRotationCenterXProperty); }
set { SetValue(IconRotationCenterXProperty, value); }
}
// Using a DependencyProperty as the backing store for IconRotationCenterX. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconRotationCenterXProperty =
DependencyProperty.Register("IconRotationCenterX", typeof(double), typeof(ButtonIcon), new PropertyMetadata(0.0));
// CenterY for Icon rotation
public double IconRotationCenterY
{
get { return (double)GetValue(IconRotationCenterYProperty); }
set { SetValue(IconRotationCenterYProperty, value); }
}
// Using a DependencyProperty as the backing store for IconRotationCenterY. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconRotationCenterYProperty =
DependencyProperty.Register("IconRotationCenterY", typeof(double), typeof(ButtonIcon), new PropertyMetadata(0.0));
// ScaleX of Icon
public double IconScaleX
{
get { return (double)GetValue(IconScaleXProperty); }
set { SetValue(IconScaleXProperty, value); }
}
// Using a DependencyProperty as the backing store for IconScaleX. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconScaleXProperty =
DependencyProperty.Register("IconScaleX", typeof(double), typeof(ButtonIcon), new PropertyMetadata(1.0));
// ScaleY of Icon
public double IconScaleY
{
get { return (double)GetValue(IconScaleYProperty); }
set { SetValue(IconScaleYProperty, value); }
}
// Using a DependencyProperty as the backing store for IconScaleY. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconScaleYProperty =
DependencyProperty.Register("IconScaleY", typeof(double), typeof(ButtonIcon), new PropertyMetadata(1.0));
// CenterX for Icon scale
public double IconScaleCenterX
{
get { return (double)GetValue(IconScaleCenterXProperty); }
set { SetValue(IconScaleCenterXProperty, value); }
}
// Using a DependencyProperty as the backing store for IconScaleCenterX. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconScaleCenterXProperty =
DependencyProperty.Register("IconScaleCenterX", typeof(double), typeof(ButtonIcon), new PropertyMetadata(0.0));
// CenterY for Icon scale
public double IconScaleCenterY
{
get { return (double)GetValue(IconScaleCenterYProperty); }
set { SetValue(IconScaleCenterYProperty, value); }
}
// Using a DependencyProperty as the backing store for IconScaleCenterY. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconScaleCenterYProperty =
DependencyProperty.Register("IconScaleCenterY", typeof(double), typeof(ButtonIcon), new PropertyMetadata(0.0));
public double IconTranslateX
{
get { return (double)GetValue(IconTranslateXProperty); }
set { SetValue(IconTranslateXProperty, value); }
}
// Using a DependencyProperty as the backing store for IconTranslateX. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconTranslateXProperty =
DependencyProperty.Register("IconTranslateX", typeof(double), typeof(ButtonIcon), new PropertyMetadata(0.0));
public double IconTranslateY
{
get { return (double)GetValue(IconTranslateYProperty); }
set { SetValue(IconTranslateYProperty, value); }
}
// Using a DependencyProperty as the backing store for IconTranslateY. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IconTranslateYProperty =
DependencyProperty.Register("IconTranslateY", typeof(double), typeof(ButtonIcon), new PropertyMetadata(0.0));
<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>