C# 如何获取WPF中的子属性?
我想写一个触发器,当鼠标移到按钮上时,它会改变属性“Offset”。当我这样尝试时:C# 如何获取WPF中的子属性?,c#,wpf,xaml,C#,Wpf,Xaml,我想写一个触发器,当鼠标移到按钮上时,它会改变属性“Offset”。当我这样尝试时: <ControlTemplate x:Key="Button"> <Grid x:Name="button"> <Rectangle x:Name="ButtonTheme" RadiusX="10" RadiusY="10" Stroke="Silver" StrokeThickness="3" Fill="{Templa
<ControlTemplate x:Key="Button">
<Grid x:Name="button">
<Rectangle x:Name="ButtonTheme" RadiusX="10" RadiusY="10" Stroke="Silver" StrokeThickness="3" Fill="{TemplateBinding Background}"></Rectangle>
<Rectangle x:Name="HighLight" Opacity="1.0">
<Rectangle.Fill>
<RadialGradientBrush Center="0.5,0.8">
<GradientStop x:Name="Flower" Color="#AAFFFFFF" Offset="1" />
<GradientStop Color="#00FFFFFF" Offset="0" />
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<ContentControl HorizontalAlignment="Center"
VerticalAlignment="Center"
Content= "{TemplateBinding Property = ContentControl.Content}" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsMouseOver" Value="True">
<Setter TargetName="Flower" Property="Offset" Value="1" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
它返回“在可视化树中找不到名为“Flower”的子级”。有没有办法更改该属性?错误清楚地说明了问题所在。
GradientStop
不是可视树的一部分,它不是可视树。我认为这是XAML中的某种限制,最好是轻松地完成您所做的事情
为了坚持使用您现在的代码,我们只能使用一种黑客解决方案,将GradientStop的偏移量
绑定到某个已知元素的属性。(known元素在这里意味着可以通过Setter
的TargetName
集访问它)。我认为这里唯一适合的属性是标记
属性。然后可以使用Setter
来设置已知元素的标记属性。以下是遵循该想法的代码:
<ControlTemplate x:Key="Button">
<Grid x:Name="button">
<Rectangle x:Name="ButtonTheme" RadiusX="10" RadiusY="10" Stroke="Silver" StrokeThickness="3" Fill="{TemplateBinding Background}"></Rectangle>
<Rectangle x:Name="HighLight" Opacity="1.0" Tag="1">
<Rectangle.Resources>
<DiscreteObjectKeyFrame x:Key="proxy" Value="{Binding ElementName=HighLight}"/>
</Rectangle.Resources>
<Rectangle.Fill>
<RadialGradientBrush Center="0.5,0.8">
<GradientStop x:Name="Flower" Color="#AAFFFFFF"
Offset="{Binding Value.Tag, Source={StaticResource proxy}}" />
<GradientStop Color="#00FFFFFF" Offset="0" />
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<ContentControl HorizontalAlignment="Center"
VerticalAlignment="Center"
Content= "{TemplateBinding Property = ContentControl.Content}" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="HighLight" Property="Tag" Value="0" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
您可以在双动画中使用路径Fill.GradientStops[0].Offset
,目标是高亮显示
,因此在鼠标悬停时,了解要更改其偏移量的GradientStop的索引非常重要
<ControlTemplate x:Key="Button">
<Grid x:Name="button">
<Rectangle x:Name="ButtonTheme" RadiusX="10" RadiusY="10" Stroke="Silver" StrokeThickness="3" Fill="{TemplateBinding Background}"></Rectangle>
<Rectangle x:Name="HighLight" Opacity="1.0" Tag="1">
<Rectangle.Fill>
<RadialGradientBrush Center="0.5,0.8">
<GradientStop x:Name="Flower" Color="#AAFFFFFF"
Offset="1" />
<GradientStop Color="#00FFFFFF" Offset="0" />
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<ContentControl HorizontalAlignment="Center"
VerticalAlignment="Center"
Content= "{TemplateBinding Property = ContentControl.Content}" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup Name="CommonStates">
<VisualState Name="Normal"/>
<VisualState Name="MouseOver">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="HighLight" Storyboard.TargetProperty="Fill.GradientStops[0].Offset"
To="0" Duration="0"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>