Привязка TaskbarItemInfo.Overlay к экземпляру DrawingImage останавливает обновление изображения по коду - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь использовать GeometryDrawing с динамическим контентом в качестве источника для TaskbarItemInfo.Overlay . Изображение в приведенном ниже коде основано на GeometryDrawing , который Brush постоянно обновляется кодом.

1 / В целях тестирования, копия изображения с привязкой к источникуИсходное изображение Источник работает, как и ожидалось, два изображения обновляются на экране.

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 Коллекция была изменена;Операция перечисления может не выполняться

Я предполагаю, что это проблема доступа к коллекции из разных потоков , но это на самом деле не помогает мне понять проблему.

...