Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使扩展控件悬停在下一个元素上?_C#_Wpf_Xaml_Layout_Expander - Fatal编程技术网

C# 如何使扩展控件悬停在下一个元素上?

C# 如何使扩展控件悬停在下一个元素上?,c#,wpf,xaml,layout,expander,C#,Wpf,Xaml,Layout,Expander,在下面举例的设置中,我直到最近才注意到,当扩展器中列出的元素列表增长,以至于其长度超过其旁边面板中按钮的长度时,它不会像直观预期的那样悬停在数据网格上。相反,它将其向下推,使整个GUI在垂直方向上显得跳跃 <StackPanel> <StackPanel Orientation="Horizontal"> <StackPanel> <Expander>...</Expander> </StackPa

在下面举例的设置中,我直到最近才注意到,当扩展器中列出的元素列表增长,以至于其长度超过其旁边面板中按钮的长度时,它不会像直观预期的那样悬停在数据网格上。相反,它将其向下推,使整个GUI在垂直方向上显得跳跃

<StackPanel>
  <StackPanel Orientation="Horizontal">
    <StackPanel>
      <Expander>...</Expander>
    </StackPanel>
    <StackPanel>
      <Button ... /><Button ... /><Button ... />
    </StackPanel>
  </StackPanel>
  <StackPanel Orientation="Horizontal">
    <DataGrid ... />
  </StackPanel>
</StackPanel>
解决此问题的一种方法是将所有内容放在网格中的同一单元格中,最后添加扩展器。然而,在我看来,这在几个层面上是不合适的。相反,我更喜欢强制expander在其他控件上方进行非接触式扩展。它应该影响布局,但仅影响折叠状态下的布局大小。扩展不应影响布局


我怎样才能告诉愚蠢的扩展器不要这么急躁呢?

作为参考,让我们从原始XAML中为StackPanel元素编号:

<StackPanel #1>
    <StackPanel #2 Orientation="Horizontal">
        <StackPanel #3>
            <Expander>...</Expander>
        </StackPanel>
        <StackPanel #4>
            <Button ... /><Button ... /><Button ... />
        </StackPanel>
    </StackPanel>
    <StackPanel #5 Orientation="Horizontal">
        <DataGrid ... />
    </StackPanel>
</StackPanel>
此处使用的画布允许expander控件脱离容器的边界。在本例中,要使扩展控件浮在其正下方的元素上方,请使用Panel.ZIndex attached属性。我们还需要将画布的宽度绑定到扩展器的宽度,因为画布不会根据其子对象调整自身大小

以下是扩展器折叠时的外观:

以及它在展开时的外观:


请原谅这些可怕的颜色,它们只是为了让您可以看到控件边界的位置。

为了参考,让我们从原始XAML中为StackPanel元素编号:

<StackPanel #1>
    <StackPanel #2 Orientation="Horizontal">
        <StackPanel #3>
            <Expander>...</Expander>
        </StackPanel>
        <StackPanel #4>
            <Button ... /><Button ... /><Button ... />
        </StackPanel>
    </StackPanel>
    <StackPanel #5 Orientation="Horizontal">
        <DataGrid ... />
    </StackPanel>
</StackPanel>
此处使用的画布允许expander控件脱离容器的边界。在本例中,要使扩展控件浮在其正下方的元素上方,请使用Panel.ZIndex attached属性。我们还需要将画布的宽度绑定到扩展器的宽度,因为画布不会根据其子对象调整自身大小

以下是扩展器折叠时的外观:

以及它在展开时的外观:


请原谅这些可怕的颜色,它们只是为了让您可以看到控件边界的位置。

您是否考虑过使用弹出框或组合框而不是扩展器?@Sphinxxx是的。出于几个原因,它需要由膨胀机控制。事实上,目前,用丑陋的方式把所有的东西放在同一个格子里要比鬼混着换扩展器容易得多。我已经在那里烤了一些功能,并开始重新开发,使我的皮肤爬行。。。太害怕oopsies了,还有陷阱。你考虑过用弹出框或组合框代替扩展器吗?@Sphinxxx是的。出于几个原因,它需要由膨胀机控制。事实上,目前,用丑陋的方式把所有的东西放在同一个格子里要比鬼混着换扩展器容易得多。我已经在那里烤了一些功能,并开始重新开发,使我的皮肤爬行。。。太害怕糟糕了,还有怪癖。颜色太棒了!我们可以清楚地看到什么是什么。不过,我不知道这是否是canvas控件的预期用途。我的印象是,它的目的是绘制…@KonradViltersten WPF画布的目的是在特定坐标系下布局其子对象,它与绘制完全无关。它还有一个有用的特性,默认情况下允许其子对象脱离其边界,即它不会将其子对象剪裁到自己的边界。因此,当您需要重叠效果时,通常会使用它。另一个具有类似分层可能性的内置控件是Grid,但它是一个更重的面板。@KonradViltersten认为画布在这种情况下有点像position:relative;在CSS中,画布是布局槽,其子元素相对于画布定位,但最终可能会覆盖画布边界之外的其他元素。酷东西:有没有办法让扩展器也流过包含的窗口边界?我将我的扩展器打包在一个Usercontrol中,希望UC中设置的Panel.ZIndex足够了,因为看起来,我也必须在包含网格/面板中设置ZIndex,以实现在顶部。@dba我认为所有WPF控件都被剪裁到其父窗口的边界。你可以尝试使用一个弹出控件,这基本上是它自己的窗口,但是你可能会遇到焦点问题。颜色很棒!我们可以清楚地看到什么是什么。不过,我不知道这是否是canvas控件的预期用途。我的印象是,它的目的是绘制…@KonradViltersten WPF画布的目的是在特定坐标系下布局其子对象,它与绘制完全无关。它还有一个有用的特性,默认情况下允许其子对象脱离其边界,即它不会将其子对象剪裁到自己的边界。因此,当您需要重叠效果时,通常会使用它。这个
唯一具有类似分层可能性的其他内置控件是Grid,但它是一个更重的面板。@KonradViltersten认为在这种情况下画布有点像position:relative;在CSS中,画布是布局槽,其子元素相对于画布定位,但最终可能会覆盖画布边界之外的其他元素。酷东西:有没有办法让扩展器也流过包含的窗口边界?我将我的扩展器打包在一个Usercontrol中,希望UC中设置的Panel.ZIndex足够了,因为看起来,我也必须在包含网格/面板中设置ZIndex,以实现在顶部。@dba我认为所有WPF控件都被剪裁到其父窗口的边界。您可以尝试使用弹出控件,这基本上是它自己的窗口,但随后您可能会遇到焦点问题。