wpf 水平虚线拉伸到容器宽度

7qhs6swi  于 6个月前  发布在  其他
关注(0)|答案(3)|浏览(83)

我有一个包含在ScrollViewer中的布局,我需要在其中绘制一条水平虚线,该虚线延伸到容器的整个宽度。

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <StackPanel>
        <Button Width="400" Height="50" VerticalAlignment="Top" Margin="10" />
        <Line HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Stroke="Black"
              X2="{Binding ActualWidth, RelativeSource={RelativeSource Self}}"
              StrokeDashArray="2 2" StrokeThickness="1" />
    </StackPanel>
</ScrollViewer>

字符串


的数据
这几乎是可行的,但是一旦容器(在我的例子中是一个窗口)被放大,当容器被缩小时,线条并没有缩小到合适的大小。下面是我水平地上下调整窗口大小后的同一个窗口的截图。



请注意,虚线是很重要的,因为它意味着涉及拉伸线的解决方案不起作用(虚线显示为拉伸)。
我知道这是因为X2="{Binding ActualWidth, RelativeSource={RelativeSource Self}}"绑定(根据设计,线条总是可滚动区域中最宽的东西,所以当我将窗口大小调整到可滚动区域时,线条定义了可滚动区域的宽度),但是我想不出解决方案。
如何解决此问题?
为什么使用ViewportWidth不起作用


brjng4g3

brjng4g31#

我意识到我需要的是Linelayout的测量步骤中要求零空间,但随后在排列步骤中使用所有可用空间。我偶然发现了问题Make WPF/SL grid ignore a child element when determining size,它引入了使用包含此逻辑的自定义装饰器的方法。

public class NoSizeDecorator : Decorator
{
    protected override Size MeasureOverride(Size constraint) {
        // Ask for no space
        Child.Measure(new Size(0,0));
        return new Size(0, 0);
    }        
}

字符串
(我希望一些现有的布局控制合并了这种逻辑,以避免编写自己的布局逻辑,但是这里的逻辑非常简单,我并不感到大惊小怪)。

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <StackPanel>
        <Button Width="400" Height="50" VerticalAlignment="Top" Margin="10" />
        <local:NoSizeDecorator Height="1">
            <Line Stroke="Black" HorizontalAlignment="Stretch"
                  X2="{Binding ActualWidth, RelativeSource={RelativeSource Self}}"
                  StrokeDashArray="2 2" StrokeThickness="1" />
        </local:NoSizeDecorator>
    </StackPanel>
</ScrollViewer>


这工程完美

w46czmvw

w46czmvw2#

您可以在左对齐的画布中放置一条很长的线,Width为零,ClipToBounds设置为false

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <StackPanel>
        <Button Width="400" Height="50" VerticalAlignment="Top" Margin="10" />
        <Canvas HorizontalAlignment="Left" Width="0" ClipToBounds="False">
            <Line Stroke="Black" StrokeDashArray="2 2" X2="10000"/>
        </Canvas>
    </StackPanel>
</ScrollViewer>

字符串

huus2vyu

huus2vyu3#

您可以使用路径而不是直线。这将生成一条大小与容器宽度相同的水平线。
第一个月

相关问题