wpf - 有没有办法对属性的属性使用样式 setter ?

标签 wpf xaml controls styles

编辑:在最初的问题中,我对 setter 的工作方式做了一些错误的假设,因此我对其进行了修改,希望能更准确和有用。

如果鼠标不在项目上,我试图通过使图标显示为半透明来使某些菜单项更有趣。如果鼠标进入,图标应该被动画化以完全可见。
动画作品,Storyboard.TargetProperty允许直接访问图标的不透明度属性:

<Style x:Key="MenuItemMouseOverStyle" TargetType="MenuItem">
    <Style.Triggers>
        <EventTrigger RoutedEvent="MouseEnter">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity">
                        <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/>
                        <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/>
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="MouseLeave">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity">
                        <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                        <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.5"/>
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>
</Style>

如果我尝试对初始图标不透明度使用 setter,则代码将无法编译:
<Setter Property="Icon.Opacity" Value="0.5"/>

编辑:
Setter 的工作方式与我尝试使用它们的方式不同,您无法访问属性的属性(请参阅答案)
如果样式的目标类型尚未设置,您唯一可以做的就是指定一个目标类,以下样式应该是等效的:
<Style x:Key="Style1" TargetType="Image">
    <Setter Property="Opacity" Value="0.5"/>
</Style>
<Style x:Key="Style2">
    <Setter Property="Image.Opacity" Value="0.5"/>
</Style>

所以我的问题是是否有办法让它以某种方式与 setter 一起工作。

(我目前的解决方法是使用 Loaded 事件触发的单关键帧 Storyboard,效果很好)

最佳答案

我认为您不能像那样访问属性的属性,因此转换本身不是问题。即使 Icon 是类型 Image 仍然不起作用。例如,您可以尝试使用网格的背景不透明度。背景是网格的依赖属性,不透明度是画笔的依赖属性,但以下行不起作用

<Grid Background.Opacity="0.8"/>

你会得到一个错误说

The attachable property 'Opacity' was not found in type 'Background'.



你必须像这样在背景本身中设置它
<Grid>
    <Grid.Background>
        <SolidColorBrush Opacity="0.8"/>
    </Grid.Background>
</Grid>

所以当你做这样的事情时这意味着什么
<Grid TextBlock.Foreground="Red">
    <TextBlock Text="Test"/>
</Grid>

您实际上是在使用 TextBlock 的附加属性前景。

图像没有名为 Opacity 的附加属性,因此您也无法执行此操作
<MenuItem Image.Opacity="0.8" />

除了您已经在做的解决方法之外,另一种解决方法是使用类似的方法(最顶层的 MenuItem 或任何您想使用它的地方)。
<MenuItem x:Name="topMenuItem"
          ...>
    <MenuItem.Resources>
        <Style TargetType="Image">
            <Setter Property="Opacity" Value="0.5"/>
        </Style>
    </MenuItem.Resources>
    <!-- ... -->
</MenuItem>

关于wpf - 有没有办法对属性的属性使用样式 setter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577131/

相关文章:

c# - WPF 窗口按钮(关闭、最大、最小、恢复)绑定(bind)到系统命令失败

c# wpf 将 RichTextBox 格式导出到 xml 文档

c# - 无法从 ViewModel 绑定(bind)到模型的成员

wpf - 将标题/标题添加到上下文菜单

wpf - WPF 中的 TypeConverters 和 MarkupExtension 有什么区别

c# - WinForms Control.BeginInvoke 异步回调

c# - 类似于 WPF 的 Firebug 工具?

C# 在 ListView 中查找项目时出错

c# - 获取具有在 C# 中以字符串形式提供的特定名称的控件

c# - 可移动自定义控件