Связывание элементов WPF с динамически генерируемыми элементами пользовательского интерфейса - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть страница, на которой у меня есть сетка с 2 столбцами, один из которых имеет ширину 80 *, а другой - 20 *. Под сеткой находится панель стека, в которую я загружаю элементы пользовательского интерфейса (дочерние панели стека) во время выполнения.

Моя цель - привязать ширину стековых панелей к столбцам сетки. Это работает отлично, и размеры стека изменяются, если динамический контент макетируется в статическом представлении. Но при запуске приложения привязки не выполняются, а ширина не ограничивается.

Есть ли способ обновить привязки, чтобы я мог уведомить стековые панели, чтобы они указывали ширину сетки и настраивали ее размер?

Обновлен: Вот как выглядит мой 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>

Код XAML для моих динамических элементов StackPanel генерируется с помощью преобразования XSLT

Обратите внимание на динамическую StackPanel пространства имен xmlns: x. Это также должно быть сделано из-за того, что это генерируется через XSLT

Ответы [ 3 ]

0 голосов
/ 03 сентября 2010

Попробуйте связать 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 из contentPanel
2) Установите rightColumn на *
3) contentPanel HorizontalAlignment следует изменить, отличное от Stretch. Здесь я изменил его на Left

НТН

0 голосов
/ 27 сентября 2010

Я нашел решение этой проблемы. (Извините за поздний ответ)

То, что я сделал, я вырезал и вставил элемент управления Grid "resizeGrid" в панель стека "contentPanel".

Как я упоминал выше, содержимое внутри contentPanel генерируется с помощью преобразования XSLT, и это, безусловно, создает проблему со ссылкой на пространство имен. Я заметил сообщение «элемент не найден ...» в окне «Вывод» всякий раз, когда загружается это окно - это доказало, что я прав.

Помогла вставка «resizeGrid» в «contentPanel», потому что тогда оба элемента управления находятся в одном и том же пространстве имен и могут ссылаться на PropertyBinding с помощью атрибута «ElementName».

Спасибо за вашу поддержку! : -)

0 голосов
/ 03 сентября 2010

Насколько я знаю, установка Width для StackPanel с Orientation="Horizontal" не будет иметь никакого эффекта. Размер StackPanel не превышает размер его содержимого в ориентированном направлении.

Почему вы "должны" использовать StackPanel здесь? Вы почти наверняка хотите DockPanel с, учитывая вашу цель. Вам не нужно ничего связывать или устанавливать, потому что DockPanel заполнит ячейку автоматически.

...