我正在尝试使用具有动态内容的GeometryDrawing作为 TaskbarItemInfo.Overlay的源。下面代码中的图像是基于一个GeometryDrawing,它的Brush由代码不断更新。
1/ 出于测试目的,将 Source 绑定到原始图像 Source 的图像副本按预期工作,两个图像在屏幕上更新。
2/ 添加到 XAML:
<Window.TaskbarItemInfo>
<TaskbarItemInfo Overlay="{Binding ElementName=image, Path=Source}"/>
</Window.TaskbarItemInfo>
这是与任务栏图标覆盖具有相同图像的相同绑定。这会停止所有内容的更新。
我正在学习 WPF,但不明白为什么会发生这种情况。
XAML:
<Window x:Class="Test.MainWindow"
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"
xmlns:local="clr-namespace:Test"
mc:Ignorable="d"
Title="MainWindow" Width="400" Height="200">
<StackPanel Orientation="Horizontal">
<Image x:Name="image" Width="100" Stretch="Uniform" Margin="10,10,5,10">
<Image.Source>
<DrawingImage>
<DrawingImage.Drawing>
<GeometryDrawing >
<GeometryDrawing.Geometry>
<RectangleGeometry Rect="0, 0, 10, 10"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Brush>
<VisualBrush>
<VisualBrush.Visual>
<StackPanel>
<TextBlock Width="10" HorizontalAlignment="Center" VerticalAlignment="Center"
Background="Red" Foreground="White"
FontSize="10" FontWeight="Normal"
Text="{Binding Path=TextOnImage}"/>
</StackPanel>
</VisualBrush.Visual>
</VisualBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
<Image Width="100" Stretch="Uniform" Margin="5,10,10,10"
Source="{Binding ElementName=image, Path=Source}"/>
</StackPanel>
C#:
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows;
namespace Test {
public partial class MainWindow : Window {
ViewModel viewModel = new ViewModel ();
public MainWindow () {
InitializeComponent ();
DataContext = viewModel;
}
}
public class ViewModel : INotifyPropertyChanged {
string textOnImage;
public event PropertyChangedEventHandler PropertyChanged;
public string TextOnImage { get => textOnImage; set { textOnImage = value; OnPropertyChange (); } }
public ViewModel () {
var dispatcherTimer = new System.Windows.Threading.DispatcherTimer () {
dispatcherTimer.Interval = new TimeSpan (0, 0, 1);
}
dispatcherTimer.Tick += new EventHandler ((sender, e) => TextOnImage = (TextOnImage == "X" ? "O" : "X"));
dispatcherTimer.Start ();
}
void OnPropertyChange ([CallerMemberName] string property = null) {
PropertyChanged?.Invoke (this, new PropertyChangedEventArgs (property));
}
}
}
您能否指出正确的方向来理解和解决问题?
编辑:我发现了相同代码的另一个问题,这可能是链接的。
当TaskbarItemInfo.Overlay
绑定到图像时,窗口大小减小到图像大小本身减小的程度,然后文本出现在图像中,并且还覆盖在任务栏图标上,即它可以正常工作。然而,经过几次尺寸调整后,会出现异常:
System.InvalidOperationException'发生在 mscorlib.dll 集合被修改;枚举操作可能无法执行
我认为这是从不同线程访问集合的问题,但这并不能真正帮助我理解这个问题。