C# 同一视图模型的多个几乎相同的视图

C# 同一视图模型的多个几乎相同的视图,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个属性公开的视图模型,我最初有一个使用该视图模型的视图。此视图包含多个资源,然后是: <!-- View1.xaml --> <!-- several resources specific to View1 --> <StackPanel Orientation="Horizontal"> <!-- left side --> <!-- right side --> </StackPanel> 撇开这一点

我有一个属性公开的视图模型,我最初有一个使用该视图模型的视图。此视图包含多个资源,然后是:

<!-- View1.xaml -->
<!-- several resources specific to View1 -->
<StackPanel Orientation="Horizontal">
   <!-- left side -->
   <!-- right side -->
</StackPanel>
撇开这一点不谈,我需要提供相同的信息,以便仅显示左侧,而将鼠标悬停在原来的左侧上方时,右侧将显示为工具提示:

<!-- View2.xaml -->
<!-- same View1 resources -->
<!-- original left side -->
    <!-- original left side.ToolTip -->
        <!-- original right side -->
    <!--/original left side.ToolTip -->
<!--/code for original left side -->
作为第一次尝试,我通过将原始视图复制到新视图并进行更改来实现这一点

使用此选项的视图最初使用此选项,现在仍然使用:

<DataTemplate ...>
   <View1 />
</DataTemplate>
我现在有一个新的独立视图,其中包含:

<DataTemplate ...>
   <View2 />
</DataTemplate>
我不想分别复制/粘贴/维护View1和View2资源,因为它们是相同的。我更希望他们在一个地方,那么在这种情况下最好的做法是什么

我应该将资源移动到一个单独的文件中,并在View1.xaml和View2.xaml中引用它们,还是应该修改View1.xaml以支持替代工具提示,并从两个位置调用它,如下所示:

<!-- file1.xaml -->
<DataTemplate ...>
   <View1 />
</DataTemplate>

<!-- file2.xaml -->
<DataTemplate ...>
   <View1 Layout="Brief" />
</DataTemplate>
如果是后者,如何在View1中支持新的布局属性

请注意,我不需要在运行时在这些视图之间进行更改,因此我相信我不需要DataTemplateSelector


谢谢。

听起来您只需要将公共资源放入App.xaml文件的Application.resources部分。在那里定义的所有资源都在应用程序范围内可用,因此您的所有视图都可以引用它们。有关完整信息,请参见MSDN上的页面,但从该页面:

<Application.Resources>
  <Style TargetType="Button" x:Key="GelButton" >
    <Setter Property="Margin" Value="1,2,1,2"/>
    <Setter Property="HorizontalAlignment" Value="Left"/>
    <Setter Property="Template">
      <Setter.Value>
...
      </Setter.Value>
    </Setter>
  </Style>
</Application.Resources>

在本例中,GelButton样式将可用于应用程序中每个窗口和用户控件中定义的每个按钮。

如果没有更多代码,这很难评估。听起来视图的两种模式可以在ViewModel中切换。哪一个是一个VM和一个视图文件?jia,如果你的项目很大,而且你没有太多经验,我建议你做一件事,多个视图模型和视图最好有30-40%的通用代码。谢谢你的建议,但我认为我们不想把资源放在那里,因为它们只针对一个视图,现在是两个非常相似的视图。它们的通用性不足以保证应用程序的全局性。我能把它们分解成一个单独的XAML文件,这两个XAML文件可以引用,类似于在C++中包含一个共享的.h文件吗?没有规则表明每个视图都必须使用所有的应用程序。将只由两个视图使用的资源放在那里完全可以。或者,查看LearnWPF网站上的。