2013-08-09 7 views
0

У меня есть следующий код XAML:МОФ - Binding вопрос ActualWidth

<Grid Grid.Row="2" Name="grid_StatusBar"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="{Binding ElementName=wrapPanel, Path=ActualWidth}" /> 
     <ColumnDefinition Width="30" /> 
    </Grid.ColumnDefinitions> 
    <ProgressBar Grid.Column="0" HorizontalAlignment="Stretch" Margin="5,5,5,5" Name="progressBar1" VerticalAlignment="Stretch" /> 
    <WrapPanel Grid.Column="1" Name="wrapPanel" HorizontalAlignment="Right"> 
     <Label Content="1" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_Dataset" VerticalAlignment="Stretch" Visibility="Collapsed" /> 
     <Label Content="/20" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_TotalDatasets" VerticalAlignment="Stretch" Visibility="Collapsed" /> 
     <Label Content="ID:" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_IDText" VerticalAlignment="Stretch" /> 
     <Label Content="no id" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="labelID" VerticalAlignment="Stretch" /> 
    </WrapPanel> 
    <Button Grid.Column="2" Name="button_Help" Height="30" Width="30" Content="?" HorizontalAlignment="Right" VerticalAlignment="Stretch" Click="button_Help_Click" > 
</Grid> 

Что я пытаюсь показать ProgressBar как можно шире, изменяя видимость некоторых лейблов и устанавливать различные тексты (и, следовательно, . различные длины/ширины

у меня тогда различные функции:.

  • при запуске программы «нет ИД» текст labelID Этикетка заменяется с внутренним значением Ширина обновляется: OK
  • С кодом бега я изменить видимость первых двух меток, а ColumnDefinition.Width не обновляется и только первые две метки показаны (потому что не место достаточно для всех 4 из них, чтобы поместиться в wrapPanel ActualWidth: ОШИБКА!
  • Если изменить Visibility свойства из первых двух наклеек из Collapsed в Visible, от начала видимости всех этикетки Visible, и все этикетки показаны: OK
  • Из предыдущего состояния меняю видимость первых двух меток на Collapsed, то ColumnDefinition.Width обновляется и ProgressBar является как можно более широким и весь текст отображается: OK

Может кто-нибудь, пожалуйста, помогите меня? Я не понимаю, почему ширина не обновляется ...

ПРИМЕЧАНИЕ: Видимость изменяется с помощью двух кнопок в окне запуска следующий код:

label_Dataset.Visibility = System.Windows.Visibility.Visible; 
label_TotalDatasets.Visibility = System.Windows.Visibility.Visible; 

EDIT: Моя цель чтобы показать видимые метки, используя минимальное пространство (в одной строке), чтобы иметь ProgressBar с максимальной шириной.

+0

Установите ширину столбца на 'Auto' и попробуйте. –

ответ

1

Невозможно изменить ширину родительского элемента на основе ширины дочернего элемента. В вашем случае столбец является родительским элементом WrapPanel, поэтому ActualWidth из WrapPanel недоступен до тех пор, пока размер сетки/столбца уже не был определен.

Даже если вы написали код, чтобы попытаться обойти это, вы все равно столкнетесь с проблемой, поскольку последовательность мер/макета станет повторной попыткой. Всякий раз, когда размер столбца изменился, он переформатировал все дочерние элементы управления, одним из которых является WrapPanel. Это может привести к изменению ActualWidth из WrapPanel, что фактически вызывает бесконечный цикл. Чтобы предотвратить этот сценарий переполнения стека, инфраструктура сразу обнаруживает любое повторное включение в цикле компоновки/измерения и генерирует исключение.

Я не совсем уверен, чего вы пытаетесь достичь. Зачем вам нужны ярлыки в WrapPanel? Конечно, вы всегда хотели бы, чтобы 4 ярлыка находились на одной линии или, по крайней мере, на двух строках.

Если это так, я бы установил ширину второго столбца в значение «Авто» и поместил метки в другой контейнер, т. Е.один из следующих:

  • Если вы хотите, чтобы все метки завернуть, как в WrapPanel принуждают его минимальная ширина, использование:

    <StackPanel Grid.Column="1" Orientation="Vertical"> 
        ... your labels here ... 
    </StackPanel> 
    
  • Если вы хотите, чтобы все метки, чтобы остаться на той же строке, используйте:

    <StackPanel Grid.Column="1" Orientation="Horizontal"> 
        ... your labels here ... 
    </StackPanel> 
    
  • Если вы хотите две строки использовать:

    <StackPanel Grid.Column="1" Orientation="Vertical"> 
        <StackPanel Orientation="Horizontal"> 
         ... 1st 2 labels here ... 
        </StackPanel> 
        <StackPanel Orientation="Horizontal"> 
         ... 2nd 2 labels here ... 
        </StackPanel> 
    </StackPanel> 
    
+0

Привет @Peter и спасибо! Он сменил его на StackPanel. Я просто хотел показать видимые ярлыки, используя минимальное пространство (в одной строке), чтобы иметь ProgressBar с максимальной шириной. Я только что изменил 'WrapPanel' на' StackPanel' и 'ColumnDefinition' Width на' Auto', и он показан так же, как я хочу ... Еще раз спасибо! – Vic

+0

«Невозможно изменить ширину родительского элемента на основе ширины дочернего элемента»: я думаю, что панель «Холст» является единственным исключением из этого общего правила, но только потому, что она не сама по себе основана на ее дети. –