2009-06-08 15 views
15

我想告訴WPF:「如果TextBlock中不包含任何數據,則沒有表現出來。」如何讓XAML TextBlock在不包含數據時摺疊?

TRY#1簡單觸發產生錯誤「‘文本’件無效的,因爲它沒有限定的類型名稱「:

<StackPanel Margin="10"> 
    <TextBlock Padding="10" Background="Yellow" Text="{Binding MainMessage}"> 
     <TextBlock.Triggers> 
      <Trigger Property="Text" Value="{x:Null}"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </Trigger> 
     </TextBlock.Triggers> 
    </TextBlock> 
</StackPanel> 

TRY#2風格觸發產生ŧ他錯誤類型「風格」不包含公共類型轉換器類

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <Trigger Property="Text" Value="{x:Null}"> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </Trigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="MainMessageStyle" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

TRY#3風格DataTrigger產生同樣的錯誤類型「風格」不包含公共類型轉換器類

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <DataTrigger Binding="{Binding MainMessage}" Value="{x:Null}"> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </DataTrigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="MainMessageStyle" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

TRY#4:OK,那是我的一個愚蠢的疏忽,忘了靜態資源,但即使如此,雙方一起努力,#2,#嘗試3得到一個新的錯誤風格類型System.Windows.Trigger未知

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <Trigger Property="Text" Value=""> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </Trigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

那麼,如何做到這一點?

答:

OK,所以這是一個令人發狂的語法狩獵與幸福的終點,這裏有一個工作版本,希望它可以幫助別人,經驗教訓:

  • 如果觸發,然後風格
  • 如果風格,然後StaticResource的
  • 如果綁定,然後DataTrigger

代碼工作:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MainMessage}" Value="{x:Null}"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10"> 
     <ItemsControl 
      ItemsSource="{Binding DataTypeViews}"/> 
     <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 
+7

呃。爲什麼wpf如此可怕? – PeterAllenWebb 2009-06-08 15:07:07

+2

WPF團隊沒有理由爲什麼#4不只是工作!爲什麼WPF如此神祕? – 2010-07-27 17:01:36

回答

2

可嘗試#2或嘗試#3應該罰款 - 問題是在你引用的樣式行 - 你需要爲使用「風格=「{StaticResource [KeyName]}」'或'Style =「{DynamicResource [KeyName]}」'。

試試這個(在嘗試#2):

<StackPanel Margin="10">   
    <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
</StackPanel> 

在嘗試1您揭示當前WPF版本的限制:觸發器不上的元素直接支持。

1

我認爲最簡單的方法是定義一個將字符串轉換爲可見性的轉換器。

... 

    return string.IsNullOrEmpty(s) ? Visibility.Collapsed : Visibility.Visible; 
} 

然後,只需

<TextBlock Visibility="{StaticResource StringToVisibilityConverter}" 
5

最簡單,最簡單快捷的方式是轉換器。那麼,爲什麼不KISS? (保持簡單,愚蠢)?

要實現轉換器類,只需要幾行代碼。

轉換器:

public class StringToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.IsNullOrWhiteSpace((string)value) ? Visibility.Collapsed : Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var visiblity = (Visibility)value; 
     return visiblity == Visibility.Visible; 
    } 
} 

用法:

包括命名空間: xmlns:c="clr-namespace:Hfr.Windows.Controls"

定義資源: <c:StringToVisibilityConverter x:Key="StringToVisiblity"/>

使用它:

<TextBlock 
    Text="{Binding SomeStringPropertyValue}" 
    TextWrapping="Wrap" 
    Visibility="{Binding SomeStringPropertyValue, Converter={StaticResource StringToVisiblity}}" /> 

由於您將在多個項目中使用您的轉換器,在「通用庫」中實現轉換器類。

相關問題