読者です 読者をやめる 読者になる 読者になる

ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

Xamlで作ったアイコンの色をバインドする方法

XamlのPathで作られたアイコンはFillまたはStrokeをバインドして、色を変えることができます。HTMLのアイコンフォントやSVGアイコンと似たようなノリですね。しかし、Triggerを組み合わせたバインディングは少々癖があります。親要素の状態で色を変えたいときは、直接バインドするのは面倒っていうか無理です。Setterでリソースを書き換えるついでにスタイルを変えてやろうと思ったけれど、これもまたダメ。StyleでResourcesを切り替えることはできないようです。

<ControlTemplate.Triggers>
    <Trigger Property="IsSelected" Value="True">
        <Setter Property="Foreground" Value="{DynamicResource AccentColorBrush}"/>
        <Setter Property="Resources">
            <Setter.Value>
                <!-- ここでごにょごにょするのは無理らしい -->
            </Setter.Value>
        </Style>
    </Trigger>
    <!-- 略 -->
<ControlTemplate.Triggers>

じゃあどうするか…と思っていたら、こういうのを発見。
wpf - How to change a path fill (on a button) with triggers in XAML - Stack Overflow
ふむ…どこかのプロパティを経由してバインドさせればいいようです。ちなみに上の例ではButtonのプロパティを経由させてForegroundの色設定をPathのFillにバインドしています。
私の場合、正解はこうでした。

<Style TargetType="Path">
    <Setter Property="Fill" Value="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TabItem}}" />
</Style>