wpf中一个有binding的资源实现自由切换

img


这是两个路径的资源,现在我想随便转换这两个资源,但要放到资源字典转换的话binding会失效,我该怎么做

基于Monster 组和GPT的调写:
用 WPF 中的 Triggers。可以在 Canvas.Resources 标记中定义两个 PathGeometry,分别为 pathAB 和 pathBA,然后用 Trigger 来切换这两个资源。

<Canvas>
    <Canvas.Resources>
        <PathGeometry x:Key="pathAB">
            <PathFigure StartPoint="{Binding ElementName=UC,Path=stationA}">
                <ArcSegment Point="{Binding ElementName=UC,Path=stationB}" 
                            Size="{Binding ElementName=UC,Path=size}"
                            SweepDirection="Clockwise"></ArcSegment>
            </PathFigure>
        </PathGeometry>
            <PathGeometry x:Key="pathBA">
        <PathFigure StartPoint="{Binding ElementName=UC,Path=stationB}">
            <ArcSegment Point="{Binding ElementName=UC,Path=stationA}" 
                        Size="{Binding ElementName=UC,Path=size}"
                        SweepDirection="Clockwise"></ArcSegment>
        </PathFigure>
    </PathGeometry>
</Canvas.Resources>

<Canvas.Triggers>
    <EventTrigger RoutedEvent="Canvas.Loaded">
        <BeginStoryboard>
            <Storyboard>
                <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="(Canvas.Resources)">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource pathAB}" />
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
    
    <EventTrigger RoutedEvent="Canvas.MouseLeftButtonDown">
        <BeginStoryboard>
            <Storyboard>
                <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="(Canvas.Resources)">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource pathBA}" />
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Canvas.Triggers>
</Canvas>


在 Canvas.Triggers 中定义了两个 EventTrigger,分别对应于 Canvas.Loaded 和 Canvas.MouseLeftButtonDown 事件。当 Canvas 加载完成后,用 ObjectAnimationUsingKeyFrames 来将 Canvas.Resources 切换为 pathAB 资源。当鼠标单击 Canvas 时,用相同的方法将 Canvas.Resources 切换为 pathBA 资源。

该回答引用ChatGPT
在WPF中,我们可以使用DataTemplate来实现资源的自由切换。具体步骤如下:
1. 在XAML中定义两个DataTemplate,分别对应两个不同的资源路径。
xml







2. 在需要使用资源的控件中,使用ContentControl来绑定DataTemplate,并使用DataTrigger来判断当前需要使用哪个DataTemplate。
xml







在上面的代码中,我们使用ContentControl来绑定资源,然后使用Style来设置ContentTemplate的初始值为Resource1。接着,我们使用DataTrigger来判断IsResource1属性的值,如果为False,则将ContentTemplate设置为Resource2。
这样,当IsResource1属性的值改变时,ContentControl会自动切换到对应的DataTemplate,从而实现资源的自由切换。
需要注意的是,IsResource1属性需要实现INotifyPropertyChanged接口,以便在属性值改变时通知界面更新。