c# - 在 View 模型中使用 XAML 资源

标签 c# wpf xaml resources

我在 XAML 标记中声明了多个资源,并且想访问我的 View 模型中的资源。我可以很容易地使用 foo.Resources["resourceKey"] 或 findResource("") ,但这意味着我必须将我的 XAML 和 C# 代码紧密结合在一起。这不是我开始使用 MVVM 时打算做的事情。

是否有最佳实践或任何方式来使用 View 模型中 View 中定义的资源?

更新:

资源主要是符号定义,用于定义符号在 ESRI map 中的外观。 例如这个:

<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 中,但我需要在我的 View 模型中访问它们。

最佳答案

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

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

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

(我发现,如果将 SymbolTemplates.xaml 的构建操作设置为内容,则此方法效果最佳。)

一种更像 MVVM 的方法是让 View 模型层公开每个符号的“类型”。此类型将确定应用于添加到 View 的每个符号的模板或样式。然后你会使用 IValueConverter将符号类型转换为要应用的样式或模板。此值转换器需要加载资源字典,但由于值转换器存在于 View 层中,因此不会破坏 MVVM。

关于c# - 在 View 模型中使用 XAML 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726623/

相关文章:

c# - 从 WCF 服务启动多个任务

c# - 如何在 C# 中读取 sql_variant 数据库类型

c# - 如何在 WPF C# 中更改验证结果的字体大小

c# - 绑定(bind)在 ListView 中不起作用

c# - 如何在全屏页面中显示 ComboBox 的所有项目?

c# - 暂时锁定端口以供测试

c# - 通过异步/等待的服务器通信?

c# - WPF 弹出 ZOrder

c# - WP增加全景重叠

c# - 如何更改 Silverlight 使用的默认字体?