I would like to update the source of Image
when MouseMove
event is triggered:
<DataTemplate>
...
<Viewbox MaxWidth="100" MaxHeight="100" >
<Image x:Name="Vignette0" Source="{Binding Vignette}" MouseMove="Vignette0_OnMouseMove"/>
</Viewbox>
</DataTemplate>
[2]
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<DataTrigger Binding="{Binding xxxx}" Value="true">
<Setter Property="Source" Value="{Binding Vignette}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
where Vignette
is a property with notification change.
- I tried [2] to figure something with
style.triggers
(Change image using trigger WPF MVVM) but in my case the source is dynamic binding (datatemplate) - I couldn't put
MouseMove
in theBinding
at xxxx - I also tried to do something with the code-behind but I can't figure it out.
Does someone has an idea ?
Raw XAML code:
<DataGrid x:Name="DgTest" ItemsSource="{Binding Evm.RawImagesCollectionView}" AutoGenerateColumns="false"
SelectedItem="{Binding Evm.SelectedImage}">
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=ParentDir}" />
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander>
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=ParentDir}" />
<TextBlock Text="{Binding Path=ItemCount}"/>
<TextBlock Text=" images"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True"/>
<DataGridTextColumn Header="#frames" Binding="{Binding NumberOfFrames}" IsReadOnly="True"/>
<DataGridTextColumn Header="#bg" Binding="{Binding NumberOfBackgrounds}" IsReadOnly="True"/>
<DataGridTextColumn Header="path" Binding="{Binding ParentDir}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="action">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="vertical" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal">
<Button Content="prepare" Command="{Binding DecodeCommand}" Height="24"/>
<ProgressBar Minimum="0" Maximum="1.00" Value="{Binding PercentDone}" Width="40" Height="24"/>
</StackPanel>
<Viewbox MaxWidth="100" MaxHeight="100" >
<Image x:Name="VignetteViewBox0" Source="{Binding Vignette}" MouseMove="VignetteViewBox0_OnMouseMove">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<DataTrigger Binding="{Binding }" Value="true">
<Setter Property="Source" Value="{Binding Vignette}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Viewbox>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
the property Vignette
:
public BitmapImage Vignette
{
get
{
if (NumberOfFrames > 0)
{
var files = Directory.GetFiles(Filedir, "out*");
if (files.Length >= 5)
VignetteNumber = VignetteNumber != 5 ? 5 : _rgen.Next(0, files.Length);
else
VignetteNumber = _rgen.Next(0, files.Length);
var filepath = files[VignetteNumber];
var buffer = new BitmapImage();
using (Stream imageStreamSource = new FileStream(filepath,
FileMode.Open, FileAccess.Read, FileShare.Read))
{
buffer.BeginInit();
buffer.CacheOption = BitmapCacheOption.OnLoad;
buffer.StreamSource = imageStreamSource;
buffer.EndInit();
}
return buffer;
}
return null;
}
}