Я пытаюсь использовать 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 Коллекция была изменена;Операция перечисления может не выполняться
Я предполагаю, что это проблема доступа к коллекции из разных потоков , но это на самом деле не помогает мне понять проблему.