2016-04-02 55 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)合攏。如何防止呢?如果內容包含空字符串,則所有內容都按預期工作

當前的行爲:

enter image description here

預期結果:

enter image description here

我目前正在使用中的每一個 Label結合 TargetNullValue={}以防止倒塌控制

。但我想要一個解決方案,它允許我在StackPanel中使用Label控件,我可以使用Style來防止崩潰,而不必在每個綁定中爲每個Label設置TargetNullValue屬性。

+2

找到一種解決方法,對這種綁定使用'Content =「{Binding Prop,TargetNullValue = {}}」''。仍在尋找更好的解決方案。 – Poma

+0

現在使用的解決方法有什麼問題?這對我來說似乎是合理的。有很多方法可以防止控制完全崩潰,所以現在問你的問題太廣泛了。請解釋爲什麼你當前的代碼不適合你(包括解決方法),並且限制所需的替代方法,以至於不需要半打答案來擊中你真正想要的那個。 –

+0

我想成爲蘋果,將修補程序應用於所有帶有Style的標籤 – Poma

回答

0

你可以做一個網格,有他們高度設置爲auto,並設置了minHeight〜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

StackPanel不會給它的孩子比他們問任何更多的空間對於。如果沒有內容,並且您沒有明確設置維度,則Label控件不會請求任何空間。請注意,設置Height就足以滿足您的陳述目的,但當然,Label的視覺高度不取決於內容,而是取決於該明確設置。

我相信你現在使用的解決方法是合理的。它確保內容永遠不會實際上爲null,因此Label控件將始終要求高度來容納給定的內容,即使該字符串爲空。

您在評論中聲明您希望能夠通過Style應用此解決方法。如果您願意更改模型綁定的目標屬性,則可以簡單地將模型綁定到Label.DataContext屬性,然後StyleDataContext設置Content

例如:

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

樣品模型類只是具有當然的三個簡單string屬性:

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

當然,你會用什麼模型和綁定在你的情況適合。

我發現DataContext特別方便,因爲它使得XAML綁定語法非常簡單;綁定的默認源是DataContext本身,所以您只需指定TargetNullValue屬性。但如果由於某種原因,您不想直接在DataContext中存儲源值,則可以使用Tag屬性代替DataContext,如果需要的話。或者就此而言,您可以創建一個全新的視圖模型,將綁定爲DataContext,然後像Style中一樣綁定到model屬性。重要的是Style有一個一致的源屬性使用,所以相同的Style可以應用於所有的Label對象。