WPF Border DesiredHeight - PullRequest
       33

WPF Border DesiredHeight

10 голосов
/ 19 мая 2009

Следующий пример кода Microsoft содержит следующее:

<Grid>
...     
  <Border Name="Content" ... >
...     
  </Border>
</Grid>
<ControlTemplate.Triggers>
  <Trigger Property="IsExpanded" Value="True">
     <Setter TargetName="ContentRow" Property="Height"
             Value="{Binding ElementName=Content,Path=DesiredHeight}" />
  </Trigger>
...
</ControlTemplate.Triggers>

Однако при запуске этот код генерирует следующую ошибку привязки данных:

System.Windows.Data Error: 39 : BindingExpression path error: 'DesiredHeight' property not found on 'object' ''Border' (Name='Content')'. BindingExpression:Path=DesiredHeight; DataItem='Border' (Name='Content'); target element is 'RowDefinition' (HashCode=2034711); target property is 'Height' (type 'GridLength')

Несмотря на эту ошибку, код работает правильно. Я просмотрел документацию и DesiredHeight не является членом Border. Кто-нибудь может объяснить, откуда взялся DesiredHeight? Кроме того, есть ли способ устранить / устранить эту ошибку, чтобы вывод моей программы был чист?

Ответы [ 7 ]

8 голосов
/ 19 мая 2009

Вы можете увидеть это свойство в кодовой части вашего приложения

Edit:

Border content = new Border();
int desiredHeight = content.DesiredSize.Height;
int desiredWidth = content.DesiredSize.Width;

Чтобы решить эту проблему, попробуйте связать его с атрибутом высоты, поскольку DesiredHeight, по-видимому, недоступен в разметке XAML элемента управления Border.

4 голосов
/ 29 сентября 2010

Я столкнулся с этим. В соответствии с тем, что сказал user275587, их пример работает, потому что триггер удаляет Heigth = "0" для RowDefination.

Таким образом, я переключаю настройку высоты / логику запуска, чтобы у RowDefination не было установленной высоты

<Grid.RowDefinitions>
     <RowDefinition Height="Auto"/>
     <RowDefinition Name="ContentRow" />
</Grid.RowDefinitions>
...
<ControlTemplate.Triggers>
     <Trigger Property="IsExpanded" Value="False">
             <Setter TargetName="ContentRow" Property="Height" Value="0" />
     </Trigger>
</ControlTemplate.Triggers>
3 голосов
/ 25 апреля 2012

Попробуй.

<Setter
    TargetName="content"
    Property="Height"
    Value="{Binding ElementName=content, Path=DesiredHeight}"
/>
    ↓
<Setter TargetName="content" Property="Height" Value="NaN"/>

Связывание не требуется.

2 голосов
/ 05 мая 2013

Была такая же проблема. Использовал пользовательский Expander в пользовательском ComboBox. Ничто из вышеперечисленного не помогло мне, привязка к Height нарушила функциональность Expander, использование StackPanel также нарушило отображение элементов в каждой группе. Я нашел:

<Setter TargetName="ContentRow" Property="Height" Value="Auto"/>
2 голосов
/ 18 ноября 2011

Та же проблема, но принятое Карло решение не работает идеально. Проблема, с которой столкнулся плакат, исчезла, но Расширитель частично сломался -

если у вас есть контент, который необходимо расширить в уже развернутом расширителе, он не будет делать это с привязкой к DesiredSize.Height , вам нужно DesiredHeight - возможно, это связано с по причине, указанной пользователем275587.

2 голосов
/ 14 июля 2009

Я столкнулся с той же проблемой в моем приложении. В конце я изменил код так, чтобы переключать видимость содержимого между Collapsed и Visible, и заменил Grid на StackPanel.

Обычно я обнаружил, что качество образцов шаблонов управления MS довольно хорошее, но ошибка с этим была немного расстраивающей.

1 голос
/ 28 мая 2010

DesiredHeight происходит от элемента содержимого и является действительной привязкой. Я думаю, что причина, по которой ваша привязка не разрешается, заключается в том, что DesiredHeight полагается на свойство Height, а вы не установили фиксированную высоту в своем шаблоне, поэтому она оценивается как Double.Nan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...