2016-04-02 20 views
2

私はいくつかのラベルを持つテーブルを持っている:ラベルが空のコンテンツを持っている場合空のコンテンツのラベルが崩れないようにするにはどうすればよいですか?

<StackPanel Margin="20"> 
    <Label Padding="0" Content="1" /> 
    <Label Padding="0" /> 
    <Label Padding="0" Content="3" /> 
    <Label Padding="0" Content="4" /> 
</StackPanel> 

は(結合リターンがNULL)それが崩壊します。それを防ぐ方法は? Contentに空の文字列が含まれていると、すべてが意図どおりに機能します

現在の行動:

enter image description here

期待される結果:

enter image description here

私は現在、崩壊されることからコントロールを防止するための各LabelのバインディングでTargetNullValue={}を使用しています。しかし、それぞれLabelの各バインディングでTargetNullValueプロパティを設定する必要はなく、のStackPanelLabelのコントロールを使用して、ぼんやりを防ぐためにStyleを使用できるソリューションが欲しいです。

+2

このようなバインディングに 'Content =" {Binding Prop、TargetNullValue = {}} "を使用する回避策が見つかりました。それでももっと良い解決策を探しています。 – Poma

+0

現在使用している回避策は何ですか?それは私には合理的なようです。コントロールが完全に崩壊するのを防ぐ方法はたくさんありますので、あなたの質問ははるかに広すぎます。あなたの現在のコードがあなたのために(回避策を含む)うまくいかない理由を説明し、あなたが実際に欲しいものにヒットするために半ダースの答えを取らないように十分に希望の代替物を制約してください。 –

+0

スタイルですべてのラベルに修正を適用するにはリンゴにしたい – Poma

答えて

0

あなたはそれらの高さがautoに設定し、minHeightのはStackPanelがその子、彼らが尋ねるよりも、任意のより多くのスペースを与えるつもりはない10か周りが何か

+0

OPが「StackPanel」を使用し続ける場合はどうなりますか? –

+0

バインディングが空の文字列を返すか、既に実装されている回避策を使用する必要があります。 StackPanelは、子が必要とするスペースとまったく同じスペースを占有します。したがって、Labelがnullにバインドされている場合、レンダリングするものは何もありません。個人的には、ViewModelプロパティをstring.Emptyに設定するだけです – Carmine

0
<Label Padding="0" > 
    <Label.Style> 
     <Style TargetType="Label"> 
      <Style.Triggers> 
       <Trigger Property="Content" Value="{x:Null}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="Label"> 
           <Label Padding="0" Content=" "/> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Label.Style> 
</Label> 
+0

OPが現在行っているように 'TargetNullValue'を使用するよりもどのように優れていますか? –

+0

@PeterDuniho Bindingを使用しない場合でも適用されます。 – AnjumSKhan

2

に設定されている行でグリッドを行うことができますために。 Labelコントロールは、コンテンツがなく、明示的にディメンションを設定していない場合は、スペースを要求しません。 Heightを設定すると目的の目的には十分ですが、もちろんLabelの視覚的な高さはコンテンツに依存するのではなく、その明示的な設定に依存します。

あなたが現在使っている回避策は合理的なものだと思います。コンテンツが実際には決してnullでないことを保証するので、Labelコントロールは、文字列が空であっても、指定されたコンテンツに対応する高さを常に要求します。

この回避策をStyleで適用できるようにすることをコメントに記載しました。モデルバインディングのターゲットプロパティを変更する場合は、モデルをLabel.DataContextプロパティにバインドし、StyleDataContextからContentに設定するだけで簡単に行うことができます。例えば

class Model 
{ 
    public string Text1 { get; set; } 
    public string Text2 { get; set; } 
    public string Text3 { get; set; } 
} 

当然、あなたはどのようなモデルを使用して結合すると、あなたのケースでは適切であったと思います:

<Window x:Class="TestSO36368066NonCollapseLabel.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:p="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:l="clr-namespace:TestSO36368066NonCollapseLabel" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
    <l:Model Text1="label 1" Text3="label 3"/> 
    </Window.DataContext> 

    <Window.Resources> 
    <p:Style TargetType="Label"> 
     <Setter Property="Padding" Value="0"/> 
     <Setter Property="Content" Value="{Binding TargetNullValue={}}"/> 
    </p:Style> 
    </Window.Resources> 

    <StackPanel> 
    <Label DataContext="{Binding Text1}"/> 
    <Label DataContext="{Binding Text2}"/> 
    <Label DataContext="{Binding Text3}"/> 
    </StackPanel> 
</Window> 

サンプルモデルクラスは、ちょうどもちろんの3つの簡単なstring特性を有しています。

XAMLバインディング構文が非常に単純になるため、DataContextが特に便利です。バインディングのデフォルトのソースはDataContextであるため、指定する必要があるのはTargetNullValueプロパティです。しかし、何らかの理由でソース値をDataContextに直接保存したくない場合は、DataContextの代わりにTagプロパティを使用することができます。つまり、にバインドしてDataContextにバインドし、次にStyleの通常どおりにモデルプロパティにバインドすることで、まったく新しいビューモデルを作成できます。重要なことは、Styleに一貫したソースプロパティを使用することです。同じStyleをすべてのLabelオブジェクトに適用することができます。

関連する問題