我有一个StackPanel在我的WinRT C#Metro应用程序中,我想用作标签/值对的容器(TextBlock和TextBox),如下所示:
<StackPanel Orientation="Horizontal" Width="400">
<TextBlock Text="Label" Width="150" />
<TextBox Text="Value" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
现在我想要的是让TextBox自动填充StackPanel的剩余水平空间.这有可能吗?HorizontalAlignment/ HorizontalContentAlignment不工作.
我知道另一种方法是为此定义一个Grid.问题是我有几次构造,并希望在Style定义中使用它.我不想用行和列x次定义Grid的定义...
也许替代方案是定义一个自定义用户控件,但我希望有一个简单的可能性TextBox来扩展.
我已经实现类似于在所描述的一个的选择图案此篇使用视图模型来存储IsSelected值,并通过结合所述ListViewItem.IsSelected的视图模型IsSelected:
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListView.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)
它一般工作,但我遇到了严重的问题.通过VirtualizingStackPanel在列表视图中使用a 作为面板,仅ListViewItem创建了可见的.如果我使用"Ctrl + A"选择所有项目,或者使用第一项上的"Shift + Ctrl + End"快捷键组合,则会选择所有项目,但对于不可见项目,ViewModel不会获取其IsSelected设为true.这是合乎逻辑的,因为如果ListViewItem没有创建,绑定就无法工作.
任何人都遇到了同样的问题,并找到了解决方案(除了不使用a VirtualizingStackPanel)?
我想知道我所有物品的高度StackPanel.
有什么区别:
Height - 获取或设置元素的建议高度. ActualHeight - 获取此元素的渲染高度.(只读)ExtentHeight - 获取包含范围的垂直大小的值.(只读)ViewportHeight - 获取包含内容视口的垂直大小的值.(只读)DesiredSize - 获取此元素在布局过程的度量传递期间计算的大小.(只读)RenderSize - 获取(或设置,但请参阅备注)此元素的最终渲染大小.来自MSDN:
Height
获取或设置元素的建议高度.属性值:
Double- 元素的高度,与设备无关的单位(每单位1/96英寸).元件的高度,与设备无关的单位(每单位1/96英寸).
ActualHeight( readonly)
获取此元素的渲染高度.属性值:
Double- 元素的高度,作为与设备无关的单位中的值(每单位1/96英寸).此属性是基于其他高度输入和布局系统的计算值.该值由布局系统本身根据实际渲染过程设置,因此可能略微落后于作为输入更改基础的高度等属性的设置值.
因为ActualHeight是一个计算值,所以您应该知道,由于布局系统的各种操作,可能会有多个或增量报告的更改.布局系统可以计算子元素所需的度量空间,父元素的约束等等.
ExtentHeight( readonly)
获取包含范围的垂直大小的值.属性高度:
Double- 表示范围的垂直大小的Double.返回值在"设备无关像素"中描述.
ViewportHeight( readonly)
获取一个值,该值包含内容视口的垂直大小.属性值:
Double- 表示内容视口的垂直大小的Double.返回值在"设备无关像素"中描述.
DesiredSize( readonly)
获取此元素在布局过程的度量传递期间计算的大小. …
放置在StackPanel中时,Slider和其他一些控件不会拉伸以填充可用空间; 相反,宽度始终为MinWidth(如果未设置MinWidth,则为大约10个像素).如何使其伸展(相当于WinForms中的Anchor.Left | Anchor.Right)?例:
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
<Slider Value="14" SmallChange="0.5" Maximum="100" Minimum="4"
x:Name="FontSize" MinWidth="30" LargeChange="2"
TickFrequency="10" TickPlacement="TopLeft"
HorizontalAlignment="Stretch"/>
<TextBlock Margin="8" Text="{Binding ElementName=FontSize, Path=Value}"
VerticalAlignment="Center"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud) 这是我遇到的问题的一个简单例子:
<StackPanel Orientation="Horizontal">
<Label>Foo</Label>
<TextBox>Bar</TextBox>
<ComboBox>
<TextBlock>Baz</TextBlock>
<TextBlock>Bat</TextBlock>
</ComboBox>
<TextBlock>Plugh</TextBlock>
<TextBlock VerticalAlignment="Bottom">XYZZY</TextBlock>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
这些元素中的每一个除了TextBox和ComboBox垂直定位它们包含的文本不同,它看起来很丑陋.
我可以通过Margin为每个元素指定一个来排列这些元素中的文本.这是有效的,除了边距是以像素为单位,而不是相对于显示器的分辨率或字体大小或任何其他可变的东西.
我甚至不确定如何在运行时计算控件的正确底边距.
最好的方法是什么?
有没有一种简单的方法在StackPanel内的项目之间设置默认空间,所以我不必在每个项目上设置Margin属性?
我是WPF编程的初学者,来自.NET 2.0 C#.
我试图制作一个水平StackPanel,应填充数据库中的表中的数据.问题是我希望它显示带有下表中某些文本的图像,然后水平堆叠这两个项目.
这里有一些伪代码来显示我想要做的事情:
<StackPanel Orientation="horizontal" ItemsSource="{Binding Path=myTable}">
<StackPanel>
<Image Source="User.png"/>
<Label HorizontalAlignment="Center" Content="{Binding Path=UserName}"></Label>
</StackPanel>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
我根本无法想象如何做到这一点.
这应该是这么简单 - 我一直在我的桌子上长时间试图让一个看似简单的任务工作(让我觉得WPF不直观或有缺陷)......
在任何情况下,我都有一个设置为水平方向的Stackpanel.在里面我有两个TextBlocks.我希望第二个在右边显示它的文本.
我该如何完成它?
这一切让我想起了为什么我离开了Silverlight.:p
在WPF中stackpanel和virtualizingstackpanel之间有什么区别?
如何将按钮对齐ComboBox?我无法将按钮拖动到ComboBox使用设计器的一侧.
<Expander.Content>
<StackPanel>
<ComboBox Name="cbProd" Height="30" IsEditable="True" FontSize="15" />
<Button Name="btnAdd" Content="add" Click="btnAddProduct_Click" />
Run Code Online (Sandbox Code Playgroud)