ScrollViewer中的Wrappanel在两个不同的库中

时间:2017-01-31 09:03:32

标签: c# wpf xaml layout wrappanel

我是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应该包装它们的元素,我怎么能实现这种行为?

1 个答案:

答案 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>