【问题标题】:WPF Element Binding With Dynamically Generated UI ElementsWPF 元素与动态生成的 UI 元素绑定
【发布时间】:2011-04-07 20:18:13
【问题描述】:

我有一个页面,其中有一个包含 2 列的网格,一个可容纳 80* 宽度,另一个可容纳 20*。网格下方是一个堆栈面板,我在运行时将 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 中使用了对网格的 Binding):

<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 生成的

【问题讨论】:

  • 如果将 StackPanel 添加到 Grid 中,它将自动扩展以填充已添加到的列的整个宽度。
  • 我已经更新了帖子的更多细节。谢谢!

标签: wpf dynamic binding element


【解决方案1】:

我找到了解决此问题的方法。 (抱歉回复晚了)

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

如上所述,contentPanel 中的内容是通过 XSLT 转换生成的,这肯定会产生命名空间引用问题。每当加载此窗口时,我都会在输出窗口中注意到“未找到元素...”消息 - 这证明我是对的。

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

感谢您的支持! :-)

【讨论】:

    【解决方案2】:

    尝试绑定 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设置为contentPanelActualWidth
    2) 将rightColumn 设置为 *
    3) contentPanel Horizo​​ntalAlignment 应更改为 Stretch 以外的其他值。这里我改成了Left

    HTH

    【讨论】:

      【解决方案3】:

      据我所知,将StackPanelWidth 设置为Orientation="Horizontal" 将无效。 StackPanel 的大小在其定向方向上不超过其内容的大小。

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

      【讨论】:

      • 我“必须”使用 StackPanels,因为我无法控制 XSLT 转换生成的内容。 :-( 修改 XSLT 是不可能的,所以我必须使用替代方法。
      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 2013-01-16
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多