我想构建一个StackPanel带有ReverseOrder属性的自定义,我可以声明性地将其设置为true,以使StackPanel中的元素以正常的相反顺序出现(例如从下到上或从右到左).它需要在运行中可逆.
我正在考虑从StackPanel派生一个新类,但我需要知道要覆盖哪些方法.
最终解决方案
protected override System.Windows.Size ArrangeOverride( System.Windows.Size arrangeSize ) {
double x = 0;
double y = 0;
IEnumerable<UIElement> children = ReverseOrder ? InternalChildren.Cast<UIElement>().Reverse<UIElement>() : InternalChildren.Cast<UIElement>();
foreach ( UIElement child in children ) {
var size = child.DesiredSize;
child.Arrange( new Rect( new Point( x, y ), size ) );
if ( Orientation == Orientation.Horizontal )
x += size.Width;
else
y += size.Height;
}
if ( Orientation == Orientation.Horizontal )
return new Size( x, arrangeSize.Height ); …Run Code Online (Sandbox Code Playgroud) 我听说带有Stack面板的UI设计比Grids更具推广性.那是否存在任何事实.我通常使用Grid来设计我的UI,最近在一个文档中我读到Grid需要更多的时间来渲染而不是堆栈面板; 所以我对此非常困惑..请给我更多关于此的信息......(WP7开发)
我有这个堆栈面板(包含四个分数):

(分数只是带有新行和连字符的文本.)如果我添加第五个分数,它将转到10/12的右边,而不是形成第二行.
如何配置我的StackPanel以使其溢出到第二行(并保持在StackPanel的范围内)而不是无形地溢出?
标记:
<StackPanel Name="_fractionContainer" Width="700" Height="600"
Orientation="Horizontal" Margin="8, 8, 8, 8" Background="White" />
Run Code Online (Sandbox Code Playgroud) 我创建了一个Canvas,在其中我放置了一个StackPanel.StackPanel是水平的,它接受一个缩略图像列表.画布有固定的大小.当我放置比Canvas宽度更多的缩略图时,StackPanel应该从Canvas溢出,所以我可以移动它以使当前缩略图居中.
一切正常,只有StackPanel的溢出是可见的!有没有办法隐藏它?或者整个方法是错误的?
这是一个截图.画布是红色框.stackpanel是蓝色半透明的.
http://www.netpalantir.it/static/sl_canvas_overflows.jpg
谢谢!
假设我有一个动态填充副本的StackPanel,更改其中元素的Y位置.我在StackPanel中有一个特定元素,我希望在StackPanel重新定位其所有子节点后找到(相对于StackPanel或其他方式)的Y位置.
StackPanel sp = new StackPanel();
sp.Children.Add(someTextBlock);
sp.Children.Add(element1);
sp.Children.Add(element2);
...
someTextBlock.Text = "Lorem ipsum dolor..." // some text that pushes children of > index down
// element1 got pushed down to some unknown position based on text length
// now want to find the Y position of element1
Run Code Online (Sandbox Code Playgroud)
我注意到这样的方法:http://forums.silverlight.net/forums/p/16787/55881.aspx#55881不起作用,因为返回的位置是StackPanel的位置而不是子元素我是定位.
我有一个带有一组扩展器的StackPanel,如何设置它以便任何时候只展开扩展器?
干杯
AW
这是我的原始代码:
<StackPanel Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal">
<ProgressBar Height="23" Name="searchProgressBar" Foreground="Blue" BorderBrush="#00000000" BorderThickness="1" VerticalAlignment="Top" HorizontalAlignment="Stretch"/>
<TextBlock Text="asdf" Height="23" Name="progressTextBlock" VerticalAlignment="Top" Foreground="Red" HorizontalAlignment="Right"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
进度条非常小,可能是2或3像素宽,然后是文本块和空白区域.所以我尝试将元素明确地对接到两侧:
<DockPanel Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" >
<ProgressBar DockPanel.Dock="Left" Height="23" Name="searchProgressBar" Foreground="Blue" BorderBrush="#00000000" BorderThickness="1" VerticalAlignment="Top" />
<TextBlock DockPanel.Dock="Right" Text="asdf" Height="23" Name="progressTextBlock" VerticalAlignment="Top" Foreground="Red" HorizontalAlignment="Right"/>
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
徒劳无功.我也尝试通过设置HorizontalAlignment="Stretch"进度条修改每个解决方案,但没有变化.在渲染文本块后,如何拉伸它以填充所有空间?
我在整个网格上拉伸按钮时遇到问题.
我的代码看起来像这样:
<Grid x:Name="LayoutRoot" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="8*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="5" Grid.Row="1" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Button Content="Search" Background="#FF13D38D" Click="searchButton_Click" FontSize="48"/>
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
但它对我不起作用,并在整个网格上拉伸按钮,我尝试了maxwidth/maxheight但它也没有正常工作任何人都有想法?
有没有办法XAML说我想垂直对齐水平方向内的所有组件StackPanel?
我通过以下方式实现了预期的结果XAML:
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"/>
<Button VerticalAlignment="Center"/>
<TextBox VerticalAlignment="Center"/>
<Button VerticalAlignment="Center"/>
<TextBlock VerticalAlignment="Center"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
但我需要分别重复VerticalAlignment="Center"每个控件.
有没有办法在StackPanel下面的级别声明?
<StackPanel Orientation="Horizontal" VERTICALCONTENTALIGNMENT="Center">
<TextBlock/>
<Button/>
<TextBox/>
<Button/>
<TextBlock/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个png捕获StackPanel,但是当我保存时,我得到一个扭曲的视图,其中所有内容都是黑色矩形,并且大小不正确.图像保存中的宽度和高度是正确的,但是所有内容都被强制到顶部并挤压在一起
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Views="clr-namespace:POExpress.Views" x:Class="POExpress.MainWindow"
Title="My Window" Height="500" MinWidth="1000" Width="1000">
<Grid>
<TabControl>
<TabItem Header="My Epics">
<Grid Background="#FFE5E5E5">
<Border Margin="0,52,0,0" BorderThickness="1" BorderBrush="Black">
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<StackPanel x:Name="sp_ports" Orientation="Vertical"/>
</ScrollViewer>
</Border>
<Button x:Name="btn_capture" Content="Save to png" Margin="0,10,114,0" VerticalAlignment="Top" Height="31" Background="White" HorizontalAlignment="Right" Width="99" Click="Btn_capture_Click"/>
</Grid>
</TabItem>
</TabControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)
public RenderTargetBitmap GetImage()
{
Size size = new Size(sp_ports.ActualWidth, sp_ports.ActualHeight);
if (size.IsEmpty)
return null;
RenderTargetBitmap result = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, PixelFormats.Pbgra32);
DrawingVisual drawingvisual = new DrawingVisual();
using (DrawingContext context = …Run Code Online (Sandbox Code Playgroud) stackpanel ×10
wpf ×6
c# ×3
silverlight ×3
.net ×2
alignment ×2
xaml ×2
canvas ×1
clipping ×1
containers ×1
expander ×1
overflow ×1
wpf-grid ×1