0

我有一个UserControlMergedDictionaries

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

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

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

模型参考了应用程序的“主”wpf 窗口(该应用程序是 Winform 和 WPF 的混合体)。

Window.FindResource 没有找到任何一种方式:

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

有任何想法吗?谢谢你。

4

2 回答 2

2

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

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

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

于 2013-04-11T10:26:32.927 回答
1

一种更复杂的方法是将资源设置为您的 ViewModel 的属性的 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。

于 2013-04-11T10:50:08.853 回答