如何使StackPanel适合其儿童的宽度

时间:2013-09-24 15:11:39

标签: c# wpf xaml

我在这里写下因为我对这件事情有很多疑问,我希望你能帮助我:P

我想创建一个适合其所有Children宽度的动态StackPanel。我会以你为榜样。

假设我的StackPanel目前是空的。它的宽度为10(f.e.),其固定高度为30.然后我想添加一个图像,我写下来了:

BitmapImage myImage = new BitmapImage(new Uri("[PATH]"));
Image realImage = new Image();
realImage.Source = myImage;
realImage.Width = 50;
realImage.Height = myImage.Height;
myStackPanel.Children.Add(realImage);

StackPanel不会扩大到50px;它坚持10px,削减了我的形象。当我尝试添加其他UI元素(如TextBlocks等)时会发生同样的情况。

我尝试做类似

的事情
myStackPanel.Width += realImage.Width;

但当然它不起作用。我试图将StackPanel的宽度设置为“自动”,但它也没有帮助。这是XAML中的StackPanel声明:

<Window x:Name="MainWindow1" x:Class="Proj.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="myTitle" Height="480" Width="640"
    Loaded="onLoad" Background="Black" MinHeight="480" MinWidth="640">
    <Grid>
        ...(Other Closed Tags)...
        <StackPanel Orientation="Horizontal" Name="myStackPanel" Height="30" Margin="135,283,458,147"/>
    </Grid>
</Window>

我需要一个StackPanel,因为我必须显示一个动态条,其中包含可变数量的对象,这些对象将在屏幕上执行选取框效果,从右向左滑动。我既不知道对象的数量,也不知道动态条的最终宽度。

当然,如果您知道还有其他方法可以做到这一点,我会很高兴了解它:)

谢谢!

2 个答案:

答案 0 :(得分:2)

将您的stackpanel放入ScrollViewer并将其宽度设置为Auto:

    <ScrollViewer HorizontalScrollBarVisibility="Auto">
        <StackPanel  Width="Auto">
            ....
        </StackPanel>
    </ScrollViewer>

答案 1 :(得分:1)

我刚检查过,是的,您的问题是Margin。不要在布局中使用Margin进行绝对定位。 Margin应该用作父控件的边距偏移量,但在尝试定位元素(例如将项目放在窗体的中心)时应该避免,因为它会将元素剪切到特定边界。 / p>

使用auto宽度StackPanel

可轻松实现您想要的效果
<StackPanel Orientation="Horizontal" Name="myStackPanel" Height="30">
        <Button>Hello</Button>
        <Button>World</Button>
</StackPanel>

显然 - 如果您需要将其放置在窗口中的特定位置,则需要确保其具有可用的完整容器宽度 - 使用HorizontalAlignmentGrid来放置控件

从你的布局我会建议更像这样的东西:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="1.4*"></RowDefinition>
        <RowDefinition Height="30"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" Grid.Row="1" Name="myStackPanel">
        <Button>Hello</Button>
        <Button>World</Button>
    </StackPanel>
</Grid>

除非绝对必要,否则我会避免给出元素明确的大小 - 如果你的父容器可以决定大小,那就更好了

如果您希望图片在StackPanel内水平对齐,可以将HorizontalAlignment设置为Center