你好,
我想在 WPF 中制作一个自定义的堆栈面板,它会根据面板的高度自动将他的孩子调整到一定的大小。但是面板高度是动态的,因为它延伸到他的父母。当我想获得高度时(我尝试了所有可能性,请参阅代码),它始终为 0 或未定义,尽管在构建解决方案中它绝对不是 0。这是代码:
XAML:
<my:AutoSizeButtonStackPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
代码隐藏:
public class AutoSizeButtonStackPanel : StackPanel
{
public void AddChild(Button newButton)
{
double getPanelHeight;
getPanelHeight = this.ActualHeight; //is 0
getPanelHeight = this.ViewportHeight; //is 0
getPanelHeight = this.Height; //is n. def.
getPanelHeight = this.DesiredSize.Height; //is 0
getPanelHeight = this.RenderSize.Height; //is 0
newButton.Height = getPanelHeight / 2;
this.Children.Add(newButton);
}
}
Run Code Online (Sandbox Code Playgroud) 使用Blend构建ProgressBar的最佳方法是什么?
现在我有
LayoutRoot > Panorama > PanoramaItem > ListBox
我希望在ListBox后面有一个进度条,并在我的Web请求完成时隐藏它.那么,我应该将ListBox和ProgressBar放入StackPanel吗?或者我应该以编程方式添加或删除ListBox/ProgressBar?
我只想以最好的方式做到这一点.我找到的大多数教程都是针对位于固定高度区域下方的进度条,并在加载完成时隐藏.
我尝试创建一个可滚动的水平 StackPanel 但我没有成功...
目前,我的 StackPanel 的auto宽度(问题可能出在这里)包含一些项目,例如grids.
现在,如果我的所有网格在 StackPanel 中都不可见(宽度太短),我将无法滚动。我已经尝试将 StackPanel 放在 a 中,ScrollViewer但它也不起作用。
我怎样才能解决这个问题?
编辑这里是我的代码:
<StackPanel Height="85" Margin="0,0,200,15" VerticalAlignment="Bottom">
<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Left" Height="85" CanContentScroll="True">
<StackPanel x:Name="Film" Height="85" Width="Auto" Margin="0,0,0,0" Orientation="Horizontal" ScrollViewer.HorizontalScrollBarVisibility="Visible" CanHorizontallyScroll="True" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.CanContentScroll="True" d:LayoutOverrides="TopPosition, BottomPosition">
<StackPanel.Background>
<SolidColorBrush Color="{DynamicResource ButtonBackground}"/>
</StackPanel.Background>
<Grid Width="100" Background="Red"/>
<Grid Width="100" Background="#FFFF0051"/>
<Grid Width="100" Background="#FFB900FF"/>
<Grid Width="100" Background="#FF002EFF"/>
<Grid Width="100" Background="#FF00FFDC"/>
<Grid Width="100" Background="#FF51FF00"/>
<Grid Width="100" Background="Red"/>
</StackPanel>
</ScrollViewer>
</StackPanel>
Run Code Online (Sandbox Code Playgroud) 我使用网格来定义这个问题中定义的适当性Grid vs. Stackpanel.但是,在处理网格时,您必须在网格中明确定义控件位置.当必须重新排序控件或向网格添加新控件时,这会变得很麻烦.以提供的代码为例,有没有办法让文本和文本框的行和列排成一行,以便以后轻松修改或扩展?
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="7*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="Value One:" Grid.Row="0" Grid.Column="0"/>
<TextBox x:Name="TextBoxOne" Grid.Row="0" Grid.Column="1"/>
<TextBlock Text="Value Two:" Grid.Row="1" Grid.Column="0"/>
<TextBox x:Name="TextBoxTwo" Grid.Row="1" Grid.Column="1"/>
<TextBlock Text="Value Three:" Grid.Row="2" Grid.Column="0"/>
<TextBox x:Name="TextBoxThree" Grid.Row="2" Grid.Column="1"/>
</Grid>
Run Code Online (Sandbox Code Playgroud) 我有以下代码,我认为List应该填写堆栈面板占用的整个空间,我尝试使用Grid但它没有用.
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" DockPanel.Dock="Top">
<ListBox x:Name="substanceList" ItemsSource="{Binding Source={StaticResource symTable}}" DockPanel.Dock="Top" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name, Mode=TwoWay}" VerticalAlignment="Center"/>
<TextBox Text="{Binding Count, Converter={StaticResource stringToIntConverter}, Mode=TwoWay}" VerticalAlignment="Center" BorderThickness="0"/>
<Separator/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button x:Name="graphButtonStackPanel" Content="Graph" Click="graphButtonStackPanel_Click" DockPanel.Dock="Top" HorizontalAlignment="Right"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud) 我有一个按钮,按下它时会将一个文本框和一个列表框添加到堆栈面板,并将此堆栈面板添加到另一个名为"stackPanelAdd"的堆栈面板中.像这样:
private void buttonAdd_Click(object sender, RoutedEventArgs e)
{
StackPanel sp = new StackPanel();
TextBox tb = new TextBox();
ListBox lb = new ListBox();
tb.Margin = new Thickness(5, 5, 5, 0);
lb.Margin = new Thickness(5, 5, 5, 0);
lb.Height = 200;
sp.Children.Add(tb);
sp.Children.Add(lb);
stackPanelAdd.Children.Add(sp);
}
Run Code Online (Sandbox Code Playgroud)
如何删除stackpanel"stackPanelAdd"中的最后一个子节点?我应该使用像stackPanelAdd.children.Remove这样的东西吗?如果是这样,那么我如何获得stackpanel中的最后一个元素?
起初,这个例外对我来说并没有多大意义.为什么我不能多次复制这个对象?但那不是重点:
我用一个清单.每当我导航到一个网站,它应该这样做:
(App.Current as App).recent.ForEach(x => container.Children.Add(x));
Run Code Online (Sandbox Code Playgroud)
(container =另一个StackPanel)
第一次,它的工作原理.之后,我得到了问题标题中显示的异常.我已经尝试使用列表框,但我刚收到一个ArgumentException.我认为这些例外具有相同的来源,但我不知道我做错了什么.请帮忙
谢谢
我试图颠倒孩子在 StackPanel 中出现的顺序。我希望能够将新子项(在运行应用程序时)添加到列表的顶部而不是底部。我曾尝试使用各种 XAML 代码,但没有任何效果。
什么是最简单的方法来做到这一点?
我正在研究WPF应用程序.StackPanel我的xaml文件中有一个.在StackPanel中有三个按钮.问题是所有按钮都在左侧或右侧.我想要的是一个按钮是左侧的一个按钮和右侧的两个按钮.
<StackPanel Orientation="Horizontal" FlowDirection="RightToLeft" >
<Button Content="Open"/>
<Button Content="Close"/>
<Button Content="Help"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
这样的输出是这样的.

你可以看到左侧有很多空间.我希望我的帮助按钮位于极左侧,最右侧是关闭和打开.我想我可以通过实现一个网格或类似的东西来做到这一点,但我想问我是否可以只使用堆栈面板来做到这一点.
我有一个控件列表,放入stackpanel.这些控件是Hubtiles,在用户创建后以编程方式添加 - 本质上是一个列表.我需要制作添加它们的StackPanel,可滚动 - 对此最好的方法是什么?我应该将堆栈面板放在ScrollView中,然后使用Hubtile的实际高度增加StackPanels高度 - 使其可滚动,但不是这样,用户可以在没有任何东西的情况下滚动无限.因此,只要StackPanel内的控件数量达到3,它就会自动增加它的高度,如下所示:
只要StackPanel内的控件数量达到3或更高:
StackPanel.Height = StackPanel.Height + Hubtile.ActualHeight;
Run Code Online (Sandbox Code Playgroud)
非常感谢!