【问题标题】:Why is Canvas covering peer controls in Dockpanel?为什么 Canvas 涵盖 Dockpanel 中的对等控制?
【发布时间】:2011-07-04 11:01:23
【问题描述】:

为什么 Canvas 覆盖了 Dock 面板的其他子项? 我正在按照 xaml 中的标准约定在客户区顶部设置一个菜单栏,在窗口客户区底部设置一个状态栏,如下所示:

<Window x:Class="RichCoreW.ScenEditWnd"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ScenEditWnd" Height="490" Width="776" HorizontalAlignment="Right">
<DockPanel Name="mapDockP">
    <Menu IsMainMenu="True" DockPanel.Dock="Top">
        <MenuItem Header="File">
            <MenuItem Header="Save" Name="menuISave" Click="menuISave_Click"/>
            <MenuItem Header="Make Playable" Click="MakePlayable" />
        </MenuItem>
        <MenuItem Command="ApplicationCommands.Help" />
    </Menu>
    <StackPanel DockPanel.Dock="Bottom"  Name="stackPanel1" Orientation="Horizontal" background="Yellow">
        <Label Content="Playable:"  Name="label1" />
        <Label Name="labPlayable" />            
    </StackPanel>
</DockPanel>
</Window>

然后我在 C# 代码中添加一个继承自 Canvas 的 MapCanvEdit 类的实例,如下所示。作为要添加到 Dockpanel 的最后一个子项,它应该占用 Dockpanel 中的剩余空间。但它涵盖了菜单和状态栏,也涵盖了整个客户区。准确地说,是 Canvas 的子级覆盖了其他两个 Stack Panel。在 Canvas(MapCanvEdit) 为空的地方,您可以看到菜单和状态栏:

public partial class ScenEditWnd : Window
{
    ScenC scenC;
    MapCanvEdit mapCanvE;

    public ScenEditWnd(ScenC scenCI)
    {
        InitializeComponent();
        scenC = scenCI;
        mapCanvE = new MapCanvEdit(scenC);            
        mapDockP.Children.Add(mapCanvE);
        MouseWheel += mapCanvE.Zoom;
        mapCanvE.SizeChanged += delegate { mapCanvE.DrawHexs(); };
        ContentRendered += delegate { mapCanvE.DrawHexs(); };
        labPlayable.Content = scenC.playable.ToString();
    }
}

为简单起见,我省略了其他方法。任何帮助表示赞赏!

【问题讨论】:

    标签: wpf


    【解决方案1】:

    这正是 Canvas 的工作方式。它可以把它的孩子放在它自己的区域之外。如果您希望它限制子级设置ClipToBounds="True"(请参阅 MSDN 上的ClipToBounds)或使用其他面板。

    【讨论】:

    • 啊,谢谢,对于 WPF,这是一个非常简单的答案。我已经检查过了,剪裁似乎并没有提高性能。 WPF 似乎仍然花时间渲染远离屏幕的子元素,而不仅仅是超出边界。
    • 这是正确的。要告诉它不要这样做,您可能需要使用 UI 虚拟化技术(google 的关键字:wpf virtualizing canvas)
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多