【问题标题】:Docking/Filling in WPFWPF中的对接/填充
【发布时间】:2011-06-08 00:31:06
【问题描述】:

这似乎是一个简单的问题,但我已经尝试了一个小时,似乎无法弄清楚。

我想要做的就是用 Canvas 填充 MainWindow。我找不到任何允许这样做的属性,我能想到的唯一方法是设置Canvas.Width/Height = MainWindow.Width/Height,但每次调整窗口大小时我都必须这样做。

在 WinForms 中,将元素停靠在父容器中很容易。

【问题讨论】:

    标签: wpf dock fill autofill


    【解决方案1】:

    只需将 Canvas.HorizontalAlignmentVerticalAlignment 设置为“拉伸”。这将导致 Canvas 填充其包含 UI 元素的可用空间。只要确保没有明确指定宽度/高度。

    在 XAML 中,这只是:

    <Window ...Other window props... >
        <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <!-- Canvas items here... -->
        </Canvas>
    </Window>
    

    【讨论】:

    • 确保您没有在画布上明确设置 Width / Height 属性。
    • 这行得通。我知道我之前尝试过但没有用,但谁知道呢。谢谢。 --编辑:我可能设置了宽度/高度。
    • 最佳。不依赖其他任何东西。
    • 如果canvas是ItemsControl的ItemsPanelTemplate就不行了!
    【解决方案2】:

    将此作为画布宽度和高度的 xaml。

    Width="{Binding Path=ActualWidth, ElementName=Window1}"
    Height="{Binding Path=ActualHeight, ElementName=Window1}"
    

    当你调整窗口大小时它应该会相应地改变

    【讨论】:

    • 如何更好?我认为 Eric 的回答比做这种绑定更简单/健壮。
    【解决方案3】:

    在 WPF 中,您可以通过将项目放置在 DockPanel 中并使用 Dock 继承属性来进行停靠。但是,如果您希望整个 Window 成为 Canvas,只需将 Window 的内容设置为画布,而不是另一种面板:

    <Window ...>
        <Canvas>
            <!-- blah blah -->
        </Canvas>
    </Window>
    

    【讨论】:

      【解决方案4】:

      没关系,看来你得加个DockPanel

      <DockPanel Name="dockPanel1">
          <Canvas Name="canvas1" Background="White"></Canvas>
      </DockPanel>
      

      【讨论】:

      • 有很多方法可以做到这一点。这个有点矫枉过正,但可以正常工作。
      • 提示:不要将那些自动生成的名称留在您的控件上。给他们起有意义的名字。当您不必检查车牌号是否在 textBox23 或 textBox17 中时,您会更开心。更好的是,如果您不需要引用它们,则根本不要命名它们:在 WPF 中,名称是可选的。
      • @Martinho,我不知道名字是可选的。那很方便。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2011-03-20
      相关资源
      最近更新 更多