我有一个页面,其中我有一个有2列的网格,一个容纳80 *宽度,另一个容纳20 *。网格下面是一个堆栈面板,我在运行时加载UI元素(子堆栈面板)。
我的目标是将stackpanels的宽度绑定到网格的列。如果动态内容在设计视图中被模拟为静态,则此工作完美且stackpenels会调整大小。但是当运行应用程序时,绑定会失败并且宽度不会被绑定。
有没有办法刷新绑定,以便我可以通知stackpanels引用网格的宽度并配置它的大小?
更新: 这就是我的XAML的样子:
<Page x:Class="WPFTestApp.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Page1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid x:Name="resizeGrid"
Grid.Column="0" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="leftColumn"
Width="80*" />
<ColumnDefinition x:Name="rightColumn"
Width="20*" />
</Grid.ColumnDefinitions>
</Grid>
<StackPanel x:Name="contentPanel"
Grid.Column="0" Grid.Row="0" >
<!-- Dynamic StackPanels are added here -->
</StackPanel>
</Grid>
</Page>
在我的代码中,我创建了StackPanel元素并将其添加到contentPanel,方法是: contentPanel.Children.Add(...);
不幸的是,我必须在这里使用StackPanels。 : - (
动态创建的StackPanel元素的标记如下(注意我使用绑定到XAML中已存在的网格):
<StackPanel x:Name="element01"
Orientation="Horizontal"
Width="{Binding ElementName=resizeGrid, Path=ActualWidth}" >
<StackPanel x:Name="leftPanel"
Orientation="Vertical"
Width="{Binding ElementName=leftColumn, Path=ActualWidth}">
<!-- Content goes here -->
</StackPanel>
<StackPanel x:Name="rightPanel"
Orientation="Vertical"
Width="{Binding ElementName=rightColumn, Path=ActualWidth}">
<!-- Content goes here -->
</StackPanel>
</StackPanel>
我的动态StackPanel元素的XAML代码是通过XSLT转换生成的
请注意xmlns:x命名空间动态StackPanel。这也必须完成,因为它是通过XSLT生成的
答案 0 :(得分:0)
据我所知,设置Width
的{{1}}与StackPanel
无效。 Orientation="Horizontal"
的大小不会超过其内容方向的内容大小。
为什么你“有”在这里使用StackPanel
?鉴于你的目标,你几乎肯定想要StackPanel
s。您不必绑定或设置任何内容,因为DockPanel
将自动填充单元格。
答案 1 :(得分:0)
尝试绑定ActualWidth而不是Width。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid x:Name="resizeGrid"
Grid.Column="0" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="leftColumn"
Width="{Binding ElementName=contentPanel, Path=ActualWidth}" />
<ColumnDefinition x:Name="rightColumn"
Width="*" />
</Grid.ColumnDefinitions>
</Grid>
<StackPanel x:Name="contentPanel"
Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" >
<StackPanel Background="Yellow" Width="100" Height="25" />
<StackPanel Background="Green" Width="120" Height="25" />
<StackPanel Background="Red" Width="140" Height="25" />
<TextBlock Background="Gray" Text="{Binding ElementName=contentPanel, Path=ActualWidth}" />
</StackPanel>
</Grid>
我在上面做了以下更改:
1)将leftColumn
设置为ActualWidth
的{{1}}
2)将contentPanel
设置为*
3)rightColumn
HorizontalAlignment应在contentPanel
之后更改。在这里,我将其更改为Stretch
HTH
答案 2 :(得分:0)
我找到了解决此问题的方法。 (对不起,迟到的回复)
我做的是,我将“resizeGrid”网格控件剪切并粘贴到“contentPanel”Stackpanel中。
正如我上面提到的,contentPanel中的内容是通过XSLT转换生成的,这肯定会产生命名空间引用问题。
,无论何时加载此窗口,我都会在“输出”窗口中注意到“找不到元素...”消息将“resizeGrid”插入“contentPanel”会有所帮助,因为这两个控件都位于同一名称空间中,并且可以使用“ElementName”属性为PropertyBinding引用。
感谢您的支持! : - )