我目前正在为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
,它就会永远消失。当祖先的前景因触发(例如,鼠标悬停或进行任何绑定)而改变 时,我还希望它继承前景。
我曾尝试过的事情:检查祖先是否有任何触发器,然后将鼠标悬停在事件上...但是我发现它是一个微弱的一维解决方案,因为它不会影响其他触发器。 / p>
随着祖先控件的变化,我该如何管理它们的颜色?
这个简单的绑定可以满足我的要求,但是如果没有祖先,它将在控制台中进行警告:
<Path Fill="{Binding Foreground, FallbackValue=Black, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Control}}"/>