2009-05-19 4 views
9

Microsoft example codeには、次のものが含まれていますWPFボーダー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> 

実行は、しかし、このコードは、次のデータバインディングエラーが発生した場合:このエラーにもかかわらず

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

を、コードが正しく動作します。私は文書を見て、DesiredHeightBorderのメンバーではないようです。誰でもDesiredHeightがどこから来ているのか説明できますか?また、私のプログラムの出力がきれいであるように、このエラーを解決/抑止する方法はありますか?

答えて

8

あなたはあなたのアプリケーション

編集のコードの一部で、そのプロパティを見ることができます:DesiredHeightが利用可能ではないようですから、height属性にバインドしてみてください問題を解決するために

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

BorderコントロールのXAMLマークアップに追加します。

+0

いいえ、それは動作します(DesiredSize.Heightはdoubleです)。それでDesiredHeightはBorder.DesiredSize.Heightにマップするだけですか?これは何らかの非公式の不動産ですか? –

+0

これはドキュメント化されていないと確信しています。つまり、高さを100に設定しても、XAMLがコンテンツに基づいてサイズを制御していて、それ以外の理由で変更する可能性があります。 ActualHeightプロパティとActualWidthプロパティです。コントロールのサイズを固定したい場合は、代わりにMinWidthとMinHeightを設定する必要がありますが、ほとんどの場合はこれをお勧めしません。主にこれは、WindowsApplicationsで発生したサイズ変更の問題を解決することです。 – Carlo

2

私のアプリケーションで同じ問題が発生しました。最後に、コードの内容を変更して、コンテンツの表示をCollapsedVisibleの間で切り替え、GridStackPanelに置き換えました。

私は、MSコントロールテンプレートサンプルの品質がかなり良いと判断しましたが、このエラーは少しイライラしました。

1

DesiredHeightはコンテンツ要素から来ており、有効なバインディングです。あなたのバインディングが解決しない理由は、DesiredHeightがHeightプロパティに依存し、Double.Nanに評価されるようにテンプレート内の固定高さを設定していないためだと思います。

4

私はこれに遭遇しました。 user275587の行に沿って、トリガーがRowDefinationのHeigth = "0"を削除するため、その例が機能します。

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

同じ問題を設定していないが、カルロによって受け入れられた解決策は完璧に動作しませんので、だから私は、高さの設定/トリガロジックを切り替えます。ポスターは直面していた 問題が離れて行くが、すでに展開し、膨張して展開する必要がありますいくつかのコンテンツを持っている場合、エクスパンダは、部分的に

breaks-、それはに結合DesiredSize.Heightとそうではないだろう、 DesiredHeightが必要です - 理由はuser275587が原因である可能性があります。

2

お試しください。

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

結合は不要です。

2

同じ問題がありました。カスタムのExpanderをカスタムで使用していたComboBox。 上記のうちどれも私のために働いていませんでした。の機能を破ったExpanderを使用して、StackPanelを使って各グループの項目の表示を破った。私は見つけた:

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

これは私にとってはうまくいくものですが、Autoを有効に使うとDesiredHeightが使用されますが、最も簡潔なバインディングが使用されるため、おそらく最良の答えです。 –

+0

私はValue = "*"が必要ですが、これはうまくいきます –