AvalonDock - 防止可锚定面板停靠在文档面板中

8

如何防止锚点被停靠到我的文档窗格中?我希望它们能够拖动并在屏幕上移动,但有时用户会将它们拖入文档窗格中,从而使其看起来不好。然后他们关闭选项卡,我就无法重新打开该锚点。

如果需要,以下是我的Avalon代码:

        <avalonDock:DockingManager.Theme>
            <avalonDock:VS2010Theme />
        </avalonDock:DockingManager.Theme>

        <avalonDock:DockingManager.DocumentHeaderTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <StackPanel Orientation="Horizontal">
                        <!-- the TextBlock named Limiter is used to limit the height of the TextBlock for the workflow name. -->
                        <TextBlock x:Name="Limiter" TextWrapping="NoWrap" Visibility="Hidden"
                                                       TextTrimming="CharacterEllipsis">
                                                L
                        </TextBlock>
                        <TextBlock Text="{Binding Path=Title}" VerticalAlignment="Center"
                                   ToolTip="{StaticResource WorkflowTabItemToolTip}"
                                   MaxHeight="{Binding ActualHeight, ElementName=Limiter}" MaxWidth="150"
                                   TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Margin="0,0,2,0" 
                                   AutomationProperties.AutomationId="WorkflowTabTitleText"/>
                        <TextBlock Text=" *" 
                                   ToolTip="Has unsaved changes"
                                   Visibility="{Binding Content.UnsavedEdits, Converter={StaticResource BoolToVis}}"
                                   AutomationProperties.AutomationId="DirtyTabIndicator"/>
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </avalonDock:DockingManager.DocumentHeaderTemplate>

        <avalonDock:DockingManager.LayoutItemContainerStyleSelector>
            <utilities1:PanesStyleSelector>
                <utilities1:PanesStyleSelector.WebUIStyle>
                    <Style TargetType="{x:Type avalonDock:LayoutAnchorableItem}">
                        <Setter Property="Title" Value="{Binding Model.Title}"/>
                        <Setter Property="IconSource" Value="{Binding Model.IconSource}"/>
                        <Setter Property="Visibility" Value="{Binding Model.IsVisible, Mode=TwoWay, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter={x:Static Visibility.Hidden}}"/>
                        <Setter Property="ContentId" Value="{Binding Model.ContentId}"/>
                        <Setter Property="IsSelected" Value="{Binding Model.IsSelected, Mode=TwoWay}"/>
                        <Setter Property="IsActive" Value="{Binding Model.IsActive, Mode=TwoWay}"/>
                    </Style>
                </utilities1:PanesStyleSelector.WebUIStyle>
                <utilities1:PanesStyleSelector.DocumentStyle>
                    <Style TargetType="{x:Type avalonDock:LayoutItem}">
                        <Setter Property="Title" Value="{Binding Model.WorkflowName}" />
                        <Setter Property="IsActive" Value="{Binding Model.IsActive}" />
                        <Setter Property="IsSelected" Value="{Binding Model.IsActive}" />
                    </Style>
                </utilities1:PanesStyleSelector.DocumentStyle>
            </utilities1:PanesStyleSelector>
        </avalonDock:DockingManager.LayoutItemContainerStyleSelector>

        <avalonDock:DockingManager.LayoutItemTemplateSelector>
            <utilities1:PanesTemplateSelector>
                <utilities1:PanesTemplateSelector.WorkflowDesignerViewTemplate>
                    <DataTemplate>
                        <ContentControl cal:View.Model="{Binding}" IsTabStop="False" />
                    </DataTemplate>
                </utilities1:PanesTemplateSelector.WorkflowDesignerViewTemplate>
                <utilities1:PanesTemplateSelector.WebUIViewTemplate>
                    <DataTemplate>
                        <ContentControl cal:View.Model="{Binding}" IsTabStop="False" />
                    </DataTemplate>
                </utilities1:PanesTemplateSelector.WebUIViewTemplate>
            </utilities1:PanesTemplateSelector> 
        </avalonDock:DockingManager.LayoutItemTemplateSelector>

        <avalonDock:LayoutRoot>
            <avalonDock:LayoutPanel Orientation="Horizontal">
                <avalonDock:LayoutDocumentPaneGroup>
                    <avalonDock:LayoutDocumentPane AutomationProperties.AutomationId="AvalonDocumentPane"/>
                </avalonDock:LayoutDocumentPaneGroup>
                <avalonDock:LayoutAnchorablePane DockWidth="800" DockMinWidth="400" AutomationProperties.AutomationId="WebUIPane"/>
                <avalonDock:LayoutAnchorablePane DockWidth="225" DockMinWidth="225" AutomationProperties.AutomationId="ActivitiesPane">
                    <avalonDock:LayoutAnchorable Title="Activities" AutoHideWidth="225" AutoHideMinWidth="225" CanClose="False" CanHide="False">
                        <toolbox:ToolboxControl Name="Toolbox" AutomationProperties.AutomationId="ActivitiesToolbox"
                                                        utilities1:ToolboxItemSource.ToolboxItems="{Binding ToolboxList}" />
                    </avalonDock:LayoutAnchorable>
                </avalonDock:LayoutAnchorablePane>
            </avalonDock:LayoutPanel>
        </avalonDock:LayoutRoot>

    </avalonDock:DockingManager>

4
你解决这个问题了吗? - Robot Mess
你尝试捕获可锚定对象移动到窗口并将属性<a href="http://doc.xceedsoft.com/products/XceedWpfToolkit/Xceed.Wpf.AvalonDock~Xceed.Wpf.AvalonDock.Layout.LayoutPositionableGroup%601~CanRepositionItems.html">CanRepositionItems</a>更改为false的事件了吗? - Mickael Thumerel
2个回答

2
尽管我没有找到直接阻止停靠的方法,但我能够解决基本问题,即为工具窗口和文档窗口自定义不同的选项卡标题。我的文档窗口在选项卡标题中显示星号(*)以指示更改(就像VS一样),而工具窗口则不应该这样做。
解决方案是使用DocumentHeaderTemplateSelector并为其提供两个不同的模板,一个用于文档,另一个用于工具窗口。以下是XAML代码:
<xcad:DockingManager.DocumentHeaderTemplateSelector>
  <bd:DocumentHeaderTemplateSelector>
    <bd:DocumentHeaderTemplateSelector.DocumentTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal">
          <Image Source="Resources\AppIcon.ico" Margin="0,0,4,0" Width="16" />
          <TextBlock Text="{Binding Title}" />
          <TextBlock Text=" *" Visibility="{Binding Content.IsDirty, Converter={StaticResource BoolToVisibilityConverter}}" />
        </StackPanel>
      </DataTemplate>
    </bd:DocumentHeaderTemplateSelector.DocumentTemplate>
    <bd:DocumentHeaderTemplateSelector.ToolWindowTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal">
          <TextBlock Text="{Binding Title}" />
        </StackPanel>
      </DataTemplate>
    </bd:DocumentHeaderTemplateSelector.ToolWindowTemplate>
  </bd:DocumentHeaderTemplateSelector>
</xcad:DockingManager.DocumentHeaderTemplateSelector>

选择器类就是简单地这样:
Public Class DocumentHeaderTemplateSelector
  Inherits DataTemplateSelector

  Public Property DocumentTemplate As DataTemplate
  Public Property ToolWindowTemplate As DataTemplate

  Public Overrides Function SelectTemplate(item As Object, container As System.Windows.DependencyObject) As System.Windows.DataTemplate
    Dim itemAsLayoutContent = TryCast(item, Xceed.Wpf.AvalonDock.Layout.LayoutContent)

    If TypeOf item Is Xceed.Wpf.AvalonDock.Layout.LayoutDocument AndAlso TypeOf DirectCast(item, Xceed.Wpf.AvalonDock.Layout.LayoutDocument).Content Is DocumentVM Then
      Return DocumentTemplate
    Else
      Return ToolWindowTemplate
    End If
  End Function
End Class

现在我的工具窗口即使移动到文档窗格中,也不会显示星号(*)和图标。

希望这能对其他人有所帮助。


0
    <avalonDock:LayoutRoot>
                <avalonDock:LayoutPanel CanRepositionItems="False" Orientation="Vertical">

                    <avalonDock:LayoutAnchorablePane Name="ToolsPane" DockHeight="100" CanRepositionItems="False">

                        <avalonDock:LayoutAnchorable CanDockAsTabbedDocument="False"/>

                    </avalonDock:LayoutAnchorablePane>
                    
                </avalonDock:LayoutPanel>
                
</avalonDock:LayoutRoot>

avalonDock:LayoutAnchorable 集合中,

CanDockAsTabbedDocument

属性设置为 False。 这将禁用可停靠视图停靠在文档窗格中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接