2010-09-03 115 views
0

我有一个页面,其中我有一个2列的网格,一个容纳80 *宽度,另一个容纳20 *。在网格下面是一个堆栈面板,我在运行时加载UI元素(子堆栈面板)。WPF元素绑定与动态生成的UI元素

我的目标是将堆叠面板的宽度绑定到网格的列。如果动态内容在设计视图中被嘲弄为静态,这完美地工作并且stackpenels调整大小。但是,当应用程序运行时,绑定失败并且宽度没有绑定。

有什么办法刷新绑定,以便我可以通知堆叠面板引用网格的宽度并配置其大小?

更新: 这是我的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

你有代码示例吗? – 2010-09-03 12:56:10

+0

如果将一个StackPanel添加到网格中,它将自动扩展以填充已添加的列的整个宽度。 – 2010-09-03 13:28:30

+0

我已更新该帖子的更多详细信息。谢谢! – shehandavy 2010-09-03 17:03:03

回答

0

我发现这个问题的解决方案。 (对不起,为延迟响应)

我所做的是,我剪切并将“resizeGrid”网格控件粘贴到“contentPanel”Stackpanel中。

如上所述,contentPanel内的内容是通过XSLT转换生成的,这肯定会创建一个命名空间参考问题。无论何时加载此窗口,我都会在Output窗口中注意到“element not found ...”消息 - 这证明了我是正确的。

将“resizeGrid”插入到“contentPanel”中会有所帮助,因为这两个控件都在同一个名称空间内,并且可以使用“ElementName”属性为PropertyBinding引用。

感谢您的支持! :-)

0

据我知道设定的与Orientation="Horizontal"将不起作用。 StackPanel的尺寸在其方向上不超过其内容的尺寸。

为什么你“有”在这里使用StackPanel?考虑到你的目标,你几乎可以肯定要DockPanel。您不必绑定或设置任何内容,因为DockPanel会自动填充单元格。

+0

我“有”使用StackPanels,因为我无法控制从XSLT转换生成的内容。 :-(修改XSLT是不成问题的,所以我必须做出替代方案。 – shehandavy 2010-09-27 09:02:35

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到的contentPanel
)设置rightColumn为*
3)contentPanel的Horizo​​ntalAlignment应当改变其他然后Stretch。在这里,我已经把它改为Left

HTH

+0

哎呀问题已更新! – 2010-09-03 17:51:07