WPF には、UserControls で構成されるリストを含む ListBox があります。コントロールは、アプリケーション内のさまざまな画面に移動するためのものです。各 UserControl (NavigationButton と呼ばれる) には、アイコンとテキストがあります。アイコンはほとんどが複数の Path オブジェクトの組み合わせであるため、各アイコンは独自の UserControl であり、ContentPresenter を使用して表示されています。画面のさまざまな状態に応じてアイコンの色をアニメーション化できるようにしたいのですが、多くのオプションを試しましたが、これを行うことができませんでした。
以下は、NavigationButton の簡素化されたバージョンです。
<DockPanel Margin="12,0,12,0">
<!-- Icon -->
<ContentPresenter x:Name="Content_Icon" Content="{Binding}" Width="20"/>
<!-- Text -->
<Grid Margin="9,0,0,0">
<TextBlock x:Name="TextBlock_Text" Text="{Binding ScreenName, Converter={StaticResource StringToStringUpperConverter}}" VerticalAlignment="Center"
FontSize="15" Foreground="#FFF2F2F2" />
</Grid>
基本的に、ContentPresenter のプロパティをアニメーション化する必要がありますが、アクセス方法がわかりません。
以下は、NavigationButtons をホストする ListBox です。
<ListBox DockPanel.Dock="Top" ItemsSource="{Binding ScreenViewModels}"
SelectedItem="{Binding SelectedScreenViewModel}">
<ListBox.ItemTemplate>
<DataTemplate>
<my:NavigationButton/>
</DataTemplate>
</ListBox.ItemTemplate>
これらのすべてのアイコン UserConrolls が継承できる基本 UserControl (IconBaseControl と呼ばれる) を作成しました。基本コントロールには、IconFill と呼ばれる Brush DependencyProperty があります。変更可能なアイコン上のパスの部分は、このプロパティにバインドされています。
<Path Data="<data>" Fill="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type my:IconBaseControl}}, Path=IconFill}"
UserControl のデフォルトの色を変更すると色が変わるため、バインドが正しく機能していることがわかります。理想的には、さまざまな状態が存在するため、VisualStateManager を使用したいと考えています。したがって、NavigationButton に VisualStateManager があります。これは、Content_Icon と呼ばれる、アイコン (IconBaseControl を継承するすべての UserControls) をホストする ContentPresenter を含む UserControl です。ある州で次のようなことを試しました。
<VisualState x:Name="Deselected">
<Storyboard>
<ColorAnimation Storyboard.TargetName="TextBlock_Text" Storyboard.TargetProperty="Foreground.Color"
To="#FF5e5e5e" Duration="0"/>
<ColorAnimation Storyboard.TargetName="Content_Icon" Storyboard.TargetProperty="IconFill"
To="#FF5e5e5e" Duration="0"/>
</Storyboard>
</VisualState>
しかし、次のエラーが表示されます。
InvalidOperationException: プロパティ パス 'IconFill' 内のすべてのプロパティ参照を解決できません。該当するオブジェクトがプロパティをサポートしていることを確認してください。
また、ストーリーボードのプロパティを次のようなものにバインドしてみました:
Storyboard.TargetProperty="(IconBaseControl.IconFill)
しかし、このエラーが発生します:
IconBaseControl は、Windows Presentation Foundation (WPF) プロジェクトではサポートされていません。
また、コード ビハインドをいじってみましたが、ContentPresenter を IconBaseControl に変換する方法がわかりません。私は ContentTemplate プロパティが行くべき道だと考えましたが、それは何もありません。
このプロパティをアニメーション化する方法について何か提案はありますか? ほとんど何でもオープンです:)私はVB.Netでコーディングしていますが、C#の提案も問題ありません。
前もって感謝します。
編集: NavigationButton のコードが含まれています