代码如何在模型中查找无法访问用户控件的资源

时间:2013-04-11 10:21:55

标签: c# wpf menuitem controltemplate resourcedictionary

我的UserControlMergedDictionaries

<UserControl.Resources>
  <ResourceDictionary>
     <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="../LimitResources.xaml" />
        <ResourceDictionary Source="../MenuItemTemplateResources.xaml" />
     </ResourceDictionary.MergedDictionaries>
   ...
</UserControl.Resources>

在我的模型中创建了Menu。我想访问MenuItemTemplateResources.xaml中声明的ControlTemplate。 ControlTemplate看起来像这样

<ControlTemplate x:Key="SubMenuItemCombo" TargetType="MenuItem">
.....
</ControlTemplate>

Model引用了应用程序的“main”wpf窗口(该应用程序是Winform和WPF的混合)。

Window.FindResource找不到任何一种方法:

FindResource("SubMenuItemCombo");
FindResource(new ComponentResourceKey(typeof(MenuItem), "SubMenuItemCombo"));

有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是在资源类的文件后面的代码中定义一个属性

public string StrResource1
{
   get {return FindResource("SubMenuItemCombo");}
}

然后您可以访问资源类之外的那个。 如果您不想通过实例访问它,也可以考虑声明静态属性。

答案 1 :(得分:1)

更复杂的方法是将资源设置为ViewRodel属性的StaticResource。如果将ViewModel实例化为资源(例如

),则可以在XAML中执行此操作
<my:ViewModel x:Key="viewModel" myResource="{StaticResource myResource}"/>

(假设您在ViewModel之前声明了资源)。

如果无法做到这一点,您可以使用像Freezable这样的辅助组件绑定到ViewModel,将资源作为上面的属性,并在ViewModel上设置所需的属性。

此解决方案适用于您希望保留ViewModel而不依赖于资源的代码的情况,例如:在控制库中,事先不知道资源。

根据应用程序的需要,您可能还会考虑将资源设置为控件的CommandParameter,并在需要时以这种方式将其传递给ViewModel;我有时会使用文件对话框来执行此操作,例如

<Button x:Name="OpenButton" Command="{Binding OpenCommand}" CommandParameter="{StaticResource openDialog}">Open File...</Button>

如果OpenCommand是ViewModel提供的ICommand实现,那么打开的对话框将作为“参数”参数传递给ICommand的Execute和CanExecute方法。可以使用任何实现ICommandSource的控件而不是Button。