0

我正在尝试使用具有动态内容的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 集合被修改;枚举操作可能无法执行

我认为这是从不同线程访问集合的问题,但这并不能真正帮助我理解这个问题。

4

0 回答 0