【问题标题】:AvalonDock document view content disapear after float windowAvalonDock 文档视图内容在浮动窗口后消失
【发布时间】:2020-06-08 10:08:35
【问题描述】:

我在我的项目中使用 AvalonDock 控件。当我将文档移动到任何地方并脱离控制时,文档内容就会消失。如果我将文档重新停靠到控件,文档内容就会出来。我确定我错过了一些如此简单的东西,但我不明白这个问题。这是 MainView 中的代码 sn-p;

            <xcad:DockingManager AllowMixedOrientation="True" DocumentsSource="{Binding DocumentViewModels}">
            <xcad:DockingManager.Resources>
                <DataTemplate DataType="{x:Type viewModels:WatchListViewModel}">
                    <local:WatchListView DataContext="{Binding}"/>
                </DataTemplate>
                <DataTemplate DataType="{x:Type viewModels:ScanListViewModel}">
                    <local:ScanListView DataContext="{Binding}"/>
                </DataTemplate>
                <DataTemplate DataType="{x:Type viewModels:SignalListViewModel}">
                    <local:SignalListView DataContext="{Binding}"/>
                </DataTemplate>
            </xcad:DockingManager.Resources>
            <xcad:DockingManager.LayoutItemContainerStyle>
                <Style TargetType="{x:Type xcad:LayoutItem}">
                    <Setter Property="Title" Value="{Binding Model.Document.Title}"/>
                </Style>
            </xcad:DockingManager.LayoutItemContainerStyle>
        </xcad:DockingManager>

为了澄清问题想分享三个截图。第一个屏幕截图是在移动到任何地方之前显示文档。第二个屏幕截图显示移动到任何地方(浮动)后的文档。第三个屏幕截图显示重新停靠到同一个地方。实际上第一张和第三张图片相同,但我想清楚地表明实际内容仍然存在。

【问题讨论】:

    标签: wpf mvvm avalondock


    【解决方案1】:

    您需要将DataTemplateSelector 添加到您的代码中,以告知 AvalonDock 哪个 DataTemplate 用于您自己的 View/ViewModel。

    为此,您需要定义一个新类,如下所示:

    class PanesTemplateSelector : System.Windows.Controls.DataTemplateSelector
    {
        public DataTemplate WatchListViewTemplate { get; set; }
        public DataTemplate ScanListViewTemplate { get; set; }
        public DataTemplate SignalListViewTemplate { get; set; }
    
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            if (item is WatchListViewModel)
                return WatchListViewTemplate;
    
            if (item is ScanListViewModel)
                return ScanListViewTemplate;
    
            if (item is SignalListViewModel)
                return SignalListViewTemplate;
    
            return base.SelectTemplate(item, container);
        }
    }
    

    那么你需要在你的 XAML 中添加这个类,如下所示:

    <xcad:DockingManager.LayoutItemTemplateSelector>
    <s:PanesTemplateSelector>
        <s:PanesTemplateSelector.WatchListViewTemplate>
            <DataTemplate>
                <p:WatchListView />
            </DataTemplate>
        </s:PanesTemplateSelector.WatchListViewTemplate>
        <s:PanesTemplateSelector.ScanListViewTemplate>
    
            <DataTemplate>
    
                <p:ScanListView />
    
            </DataTemplate>
    
        </s:PanesTemplateSelector.ScanListViewTemplate>
    
        <s:PanesTemplateSelector.SignalListViewTemplate>
    
            <DataTemplate>
    
                <p:SignalListView />
    
            </DataTemplate>
    
        </s:PanesTemplateSelector.SignalListViewTemplate>
    </s:PanesTemplateSelector>
    </xcad:DockingManager.LayoutItemTemplateSelector>
    

    s 链接到您定义 PanesTemplateSelector 的命名空间,p 链接到您定义自己的视图的命名空间

    【讨论】:

    • 你能告诉我为什么资源方法不起作用。实际上在停靠状态下工作正常,只有在浮动状态下不工作。基本上它们都不是同一个意思?
    • 基本上他们做了同样的事情,我只能猜测是基于 AvalonDock 的设计以及它如何处理自己的浮动窗口。
    • 我猜资源方法不起作用,因为控件在浮动时从逻辑树中取出,因此它不会从父级继承资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多