Wpf 根据鼠标悬停时的标签值更改图片
我需要在Wpf 根据鼠标悬停时的标签值更改图片,wpf,visual-studio-2010,Wpf,Visual Studio 2010,我需要在image的鼠标上方显示不同的图像 现在我正在这样做 <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <!-- Hover image --> <Setter Property="Cur
image
的鼠标上方显示不同的图像现在我正在这样做
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<!-- Hover image -->
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Source" Value="C:\Users\Images\Hi.png"/>
</Trigger>
</Style.Triggers>
它工作得很好。但是在显示不同的图片之前,我需要检查图像的标签属性。
也就是说,如果Tag
值是1,我需要显示Hi1.png
如果它是2,我需要显示hi2.png
我知道这可以通过处理MouseEnter
和MouseLeave
图像事件的代码隐藏来实现。
但是我想用XAML来做。有什么线索吗?你可以用
由于DataTrigger对关联的DataContext/绑定进行操作,因此需要使用图像控件
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsMouseOver}" Value="True"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" Value="1"/>
</MultiDataTrigger.Conditions>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Source" Value="C:\Users\Images\Hi1.png"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsMouseOver}" Value="True"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" Value="2"/>
</MultiDataTrigger.Conditions>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Source" Value="C:\Users\Images\Hi2.png"/>
</MultiDataTrigger>
</Style.Triggers>
我创建了一个用户控件,允许您更改鼠标上方图像的颜色。有一个矩形,它使用两种SolidColorBrush样式来切换颜色,并将图像显示为不透明材质
这a)允许您将任何图像设置为您选择的任何颜色,b)在每次需要新按钮时,您都需要重写事件逻辑
注意:源代码必须在代码中设置,因为它不能直接绑定到XAML中
ImageButton.xaml:
<UserControl x:Class="ImageButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Width="Auto"
Height="Auto"
Cursor="Hand">
<Rectangle x:Name="Border">
<Rectangle.OpacityMask>
<ImageBrush/>
</Rectangle.OpacityMask>
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" Value="{DynamicResource ImageHoverBackground}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="false">
<Setter Property="Fill" Value="{DynamicResource ImageBackground}" />
</Trigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
</UserControl>
成功了。谢谢我还有一个疑问,假设我想检查标记字符串是否包含'2',而不是'2'的精确匹配(C#相当于string.contains()),如何做到这一点??您可以使用
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace MyNamespace
{
public partial class ImageButton : UserControl
{
public static DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(ImageSource), typeof(ImageButton), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSourceChanged));
public ImageSource Source
{
get
{
return (ImageSource)GetValue(SourceProperty);
}
set
{
SetValue(SourceProperty, value);
}
}
private static void OnSourceChanged(DependencyObject Object, DependencyPropertyChangedEventArgs e)
{
ImageButton Button = Object as ImageButton;
var ImageBrush = Button.Border.OpacityMask as ImageBrush;
ImageBrush.ImageSource = Button.Source;
}
public ImageButton()
{
InitializeComponent();
}
}
}