2010-09-03 106 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