继承祖先前景画笔颜色的路径

时间:2019-06-15 01:38:58

标签: c# wpf xaml triggers binding

我目前正在为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}}"/>

0 个答案:

没有答案