C# 如何仅使用xaml创建悬停图像

C# 如何仅使用xaml创建悬停图像,c#,xaml,mvvm,C#,Xaml,Mvvm,我想重新考虑我只使用XAML所做的事情。我所拥有的是工作,但它背后有代码,如果可能的话,我宁愿它不这样做 首先是我的模型课 public class ViewModelCommandButton : ViewModelMenuItem { public ViewModelCommandButton(ICommand cmd, string toolTip, string imageUrl, string hoverImageUrl, MenuData menuData)

我想重新考虑我只使用XAML所做的事情。我所拥有的是工作,但它背后有代码,如果可能的话,我宁愿它不这样做

首先是我的模型课

    public class ViewModelCommandButton : ViewModelMenuItem
{
    public ViewModelCommandButton(ICommand cmd, string toolTip, string imageUrl, string hoverImageUrl, MenuData menuData)
        : base(cmd, menuData)
    {
        this.ToolTip = toolTip;
        this.ImageUrl = imageUrl;
        this.HoverImageUrl = hoverImageUrl;
    }
    public string ToolTip { get; private set; }
    public string ImageUrl { get; private set; }
    public string HoverImageUrl { get; private set; }
}
我的XAML看起来像这样

    <UserControl.Resources>

    <Style x:Key="ImageHyperLink" TargetType="Hyperlink">
        <Setter Property="TextDecorations" Value="{x:Null}" />       
    </Style>

</UserControl.Resources>
    <Style x:Key="RectangleButton" TargetType="{x:Type Rectangle}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Fill" Value="{DynamicResource Hover}"  />
            </Trigger>
            <Trigger Property="IsMouseOver" Value="False">
                <Setter Property="Fill" Value="{DynamicResource Normal}"  />
            </Trigger>
        </Style.Triggers>
    </Style>
我试着写一种风格来为我做这件事,但没有成功。如果我的目标是宽度或高度,但不是填充,则正确激发样式

我从一张图片开始,但认为这可能是一个问题,所以采用了你在这里看到的方法

我的风格是这样的

    <UserControl.Resources>

    <Style x:Key="ImageHyperLink" TargetType="Hyperlink">
        <Setter Property="TextDecorations" Value="{x:Null}" />       
    </Style>

</UserControl.Resources>
    <Style x:Key="RectangleButton" TargetType="{x:Type Rectangle}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Fill" Value="{DynamicResource Hover}"  />
            </Trigger>
            <Trigger Property="IsMouseOver" Value="False">
                <Setter Property="Fill" Value="{DynamicResource Normal}"  />
            </Trigger>
        </Style.Triggers>
    </Style>

如果没有ImageBrush作为资源,这应该可以工作:

<Rectangle ...>
    <Rectangle.Style>
        <Style TargetType="{x:Type Rectangle}">
            <Setter Property="Fill">
                <Setter.Value>
                    <ImageBrush ImageSource="{Binding ImageUrl}"/>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Fill">
                        <Setter.Value>
                            <ImageBrush ImageSource="{Binding HoverImageUrl}"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Rectangle.Style>
</Rectangle>

您可以将样式设置为资源:

<UserControl.Resources>
    <Style TargetType="{x:Type Rectangle}" x:Key="RectangleButton">
        <Setter Property="Fill">
            <Setter.Value>
                <ImageBrush ImageSource="{Binding ImageUrl}"/>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Fill">
                    <Setter.Value>
                        <ImageBrush ImageSource="{Binding HoverImageUrl}"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
...
<Rectangle ... Style="{StaticResource RectangleButton}"/>

...

Codebehind非常适合UI任务。不要被认为不存在的MVVM格言所束缚。谢谢!这两种方法对我都有效。在看到你的解决方案后,我意识到为什么我的解决方案不起作用。没有,我告诉解析器它需要制作一个ImageBrush,我也不知道怎么做。