在视图模型中使用XAML资源

cyej8jka  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(218)

我在XAML标记中声明了几个资源,并希望访问视图模型中的资源。我可以轻松地使用foo.Resources["resourceKey"] or findResource(""),但这意味着我必须将XAML和C#代码紧密结合在一起。这不是我开始使用MVVM时打算做的。
是否有最佳实践或任何方法来使用视图模型中的视图中定义的资源?

更新:

资源主要是符号定义,用于定义ESRIMap中符号的外观。例如:

<esri:MarkerSymbol x:Key="SMS">
    <esri:MarkerSymbol.ControlTemplate>
        <ControlTemplate>
            <Ellipse x:Name="Element" Margin="-7,-7,0,0" Width="14" Height="14" Fill="Blue">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="SelectionStates">
                        <VisualState x:Name="Unselected" />
                        <VisualState x:Name="Selected">
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="Element" Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" To="Green" Duration="00:00:0.25"/>
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
            </Ellipse>
        </ControlTemplate>
    </esri:MarkerSymbol.ControlTemplate>
</esri:MarkerSymbol>

这些符号是通过编程方式添加到Map中的,尽管我需要在视图模型中访问它们。

yuvru6vn

yuvru6vn1#

如果您真的想从视图模型层访问样式/模板,您可以做的一件事是将样式放在一个单独的ResourceDictionary中(假设您将其命名为SymbolTemplates.xaml),并将其加载到:

var resourceDictionary = new ResourceDictionary()
{
    Source = new Uri("SymbolTemplates.xaml", UriKind.Relative)
};

ControlTemplate template = resourceDictionary["SMS"] as ControlTemplate;

(我发现,如果将SymbolTemplates.xaml的Build Action设置为Content,这种方法效果最好。)
一个更MVVM的方法是让视图模型层公开每个符号的“类型”。这个类型将决定应用到视图中的每个符号的模板或样式。然后,您可以使用IValueConverter将符号的类型转换为要应用的样式或模板。这个值转换器需要加载资源字典,但是由于值转换器位于视图层中,不会破坏MVVM。

cidc1ykv

cidc1ykv2#

首先,您可能会问自己,为什么要从VM访问XAML资源。
从VM访问和操作XAML资源的方法有很多,问题还是在于,为什么要这样做。
例如,如果您想要运行动画,最好从VM触发一个事件,然后在UI上运行动画,而VM不知道该特定动画(请查看此示例)。
ViewModel的目标是保持它的UI独立性,所以尽最大努力将它们分离。

flmtquvp

flmtquvp3#

您可以获得应用程序范围的xaml资源。

Application.Current.Resources["ApplicationScopeResource"] = Brushes.White;

相关问题