我是wpf和mvvm的新手,所以我决定寻求帮助。对不起,英语不是我的母语。 我有主要的应用程序来显示一些文件。每个文档都是带有数据的外部dll + xml文件。
在主要应用程序中,我有XAML:
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Background="DarkGray">
<Border Margin="20" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White" Padding="20">
<ContentControl x:Name="ccCurrentView" cal:View.Model="{Binding Path=CurrentView}"/>
</Border>
</ScrollViewer>
在ContentControl中,我将来自dll的文档视图显示为UserControl。我们使用MVVM,因此文档的XAML是这样的:
<UserControl>
<StackPanel>
<UserControl_Type1 />
<UserControl_Type2 />...
</StackPanel>
<UserControl_Type3 />
</UserControl>
这些UserControl_TypeXXX中的任何一个都可以在它自己的dll中。
现在,用户要求我将StackPanel替换为WrapPanel用于某种类型的UserControl。并且,当用户调整主应用程序的大小时,一些控件首先包装它们的元素,然后才显示所有文档的滚动条。 但根据我读过的信息,WrapPanel并没有包含在ScrollViewer中。
如果我没有主应用程序的高度和高度,并且不能预测我的文档中的哪个UserControl应该包装它们的元素,我怎么能实现这种行为?
答案 0 :(得分:0)
我发现了这个article about xaml anti-patterns,这对我很有帮助。
在我的情况下,我在两个内容模板之间切换。一个用于ScrollViewer用于旧文档,另一个用于 - 没有。
在资源中:
<DataTemplate x:Key="ResizableContent" >
<Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="DarkGray">
<Border Margin="20" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White" Padding="20">
<ContentControl x:Name="ccCurrentView" cal:View.Model="{Binding Path=CurrentView}"/>
</Border>
</Border>
</DataTemplate>
<DataTemplate x:Key="NotResizableContent" >
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Background="DarkGray">
<Border Margin="20" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White" Padding="20">
<ContentControl x:Name="ccCurrentView" cal:View.Model="{Binding Path=CurrentView}"/>
</Border>
</ScrollViewer>
</DataTemplate>
在MainPanel中:
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource NotResizableContent}" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsResizable}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource ResizableContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>