有没有办法为样式属性使用样式设置器?

H.B*_*.B. 5 wpf xaml controls styles

编辑: 在原始问题中,我对如何设置器工作做了一些错误的假设,所以我修改它以希望更准确和有用.

我试图让一些菜单项更有趣,如果鼠标不在项目上方,图标显示为半透明.如果鼠标进入,则应该将图标设置为动画以使其完全可见.动画工作,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>
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用setter作为初始图标不透明度,代码将无法编译:

<Setter Property="Icon.Opacity" Value="0.5"/>
Run Code Online (Sandbox Code Playgroud)

编辑: 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>
Run Code Online (Sandbox Code Playgroud)

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

(我目前的解决方案是一个单关键帧故事板,由Loaded事件触发,效果很好)

Fre*_*lad 1

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

<Grid Background.Opacity="0.8"/>
Run Code Online (Sandbox Code Playgroud)

你会收到一条错误消息

在“背景”类型中找不到可附加属性“不透明度”。

你必须像这样在后台本身设置它

<Grid>
    <Grid.Background>
        <SolidColorBrush Opacity="0.8"/>
    </Grid.Background>
</Grid>
Run Code Online (Sandbox Code Playgroud)

那么当你做这样的事情时这意味着什么

<Grid TextBlock.Foreground="Red">
    <TextBlock Text="Test"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

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

图像没有名为“不透明度”的附加属性,因此您也无法执行此操作

<MenuItem Image.Opacity="0.8" />
Run Code Online (Sandbox Code Playgroud)

除了您已经执行的方法之外,另一种解决方法是使用类似的方法(最顶层的 MenuItem 或您想使用它的任何地方)。

<MenuItem x:Name="topMenuItem"
          ...>
    <MenuItem.Resources>
        <Style TargetType="Image">
            <Setter Property="Opacity" Value="0.5"/>
        </Style>
    </MenuItem.Resources>
    <!-- ... -->
</MenuItem>
Run Code Online (Sandbox Code Playgroud)