我的UserControl
有MergedDictionaries
:
<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"));
有什么想法吗?谢谢。
答案 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。