В настоящее время я пишу расширение для объекта Path
. Я хочу, чтобы он наследовал его (первый) Control
предок Foreground
цвет.
Это то, что у меня есть ...
public override void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (sender is Path path)
{
path.Loaded -= Path_Loaded;
path.Loaded += Path_Loaded;
}
}
private void Path_Loaded(object sender, System.EventArgs e)
{
if (!(sender is Path path))
{
return;
}
// Find first ancestor
var parent = path.Parents().OfType<Control>().FirstOrDefault();
if (parent != null)
{
// Apply the template
parent.ApplyTemplate();
// Set parent's control foreground
path.Fill = parent.Foreground;
}
else
{
// Fallback to default
path.Fill = Brushes.Black;
}
}
Он отлично работает для простого управления, однако его недостатком является то, что после установки Fill
он уходит навсегда. Я хотел бы, чтобы он также наследовал передний план, когда передний план предка меняет из-за триггера (например, при наведении курсора или любой другой привязки).
Что я пробовал : проверка предка на наличие любых триггеров, затем подключение мыши к событию ... но я считаю его слабым, одномерным решением, поскольку оно не повлияет на другие триггеры.
Как я могу применить «живой» цвет элемента управления предка, как он меняется?
редактировать
Это простое связывание делает именно то, что я хочу, однако оно выводит предупреждения в консоли, если не был найден предок:
<Path Fill="{Binding Foreground, FallbackValue=Black, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Control}}"/>