2009-05-19 13 views
9

La siguiente Microsoft example code contiene lo siguiente:WPF Frontera DesiredHeight

<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> 

Cuando se ejecuta, sin embargo, este código genera el siguiente error de enlace de datos:

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') 

A pesar de este error, el código funciona correctamente. Revisé la documentación y DesiredHeight no parece ser miembro de Border. ¿Alguien puede explicar de dónde viene DesiredHeight? Además, ¿hay alguna forma de resolver/suprimir este error para que mi salida del programa esté limpia?

Respuesta

8

Se puede ver que la propiedad en la parte código de su aplicación

Editar:

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

Para resolver el problema se try unión con el atributo de altura, ya que DesiredHeight no parece estar disponible en el marcado XAML del control de borde.

+0

Bien, eso funciona (aunque DesiredSize.Height es un doble). Entonces, ¿DesiredHeight simplemente hace un mapa a Border.DesiredSize.Height? ¿Es esto algún tipo de propiedad no documentada? –

+0

Estoy seguro de que no está indocumentado, la cuestión es que XAML controla el tamaño en función de su contenido, incluso si establece la altura en 100, podría cambiar por cualquier otro motivo, y la nueva altura y ancho estarán contenidos en el Las propiedades ActualHeight y ActualWidth, respectivamente. Si desea que sus controles tengan un tamaño fijo, debe establecer MinWidth y MinHeight en su lugar, pero la mayoría de las veces no lo recomiendo. Principalmente todo esto es para resolver problemas de redimensionamiento que teníamos con WindowsApplications. – Carlo

2

Encontré el mismo problema en mi aplicación. Al final, cambié el código para poder cambiar la visibilidad del contenido entre Collapsed y Visible, y reemplacé el Grid con un StackPanel.

En general, he encontrado que la calidad de las muestras de la plantilla de control MS es bastante buena, pero el error con este fue un poco frustrante.

1

DesiredHeight proviene del elemento de contenido y es un enlace válido. Creo que la razón por la que su enlace no se resuelve es porque DesiredHeight depende de la propiedad Height y no ha establecido una Altura fija en su plantilla, por lo que se evalúa como Double.Nan

4

Me encontré con esto. En la línea de lo que dijo user275587, su ejemplo funciona porque el desencadenador elimina el Heigth = "0" en RowDefination.

Así que cambiar la lógica de ajuste de altura/de disparo, por lo que el RowDefination no tiene altura establecida

<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> 
2

mismo problema, pero la solución aceptada por Carlo no funcione a la perfección. El problema que se enfrenta el cartel desaparece pero el expansor parcialmente breaks-

si tiene algún contenido que necesita para expandir en un expansor ya ampliado, no va a hacerlo con la unión a DesiredSize.Height, necesita DesiredHeight - puede deberse a una razón dada por user275587.

2

Pruébalo.

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

Encuadernación no es necesario.

2

Tenía el mismo problema. Estaba usando un Expander personalizado en un ComboBox personalizado. Ninguno de los anteriores funcionó para mí, vinculando a Height rompió la funcionalidad de Expander, utilizando un StackPanel también rompió la visualización de los elementos en cada grupo.Encontré:

<Setter TargetName="ContentRow" Property="Height" Value="Auto"/> 
+0

Esto funciona para mí, y es probablemente la mejor respuesta, ya que al utilizar Auto de manera efectiva se utilizará el deseo deseado, pero con el enlace más conciso. –

+0

Necesitaba un valor = "*" pero sí, esto funciona –

Cuestiones relacionadas