2015-09-17 60 views
1

我有一個WPF複選框的問題。我試圖將CheckBox的內容顯式設置爲TextBlock,所以我可以在不影響框中的檢查的情況下設置TextBlock的前景。TextBlock作爲複選框內容不顯示

我在一個StackPanel充滿複選框在數據網格模板列這樣做是爲了一個複選框,像這樣:

<DataGridTemplateColumn Header="Effectivity" CellStyle="{StaticResource WhiteForeground}"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Expander x:Name="EffectivityExpander" Header="{Binding EffectivityString}" Style="{StaticResource DisableExpander}" Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}, Path=Foreground}"> 
       <StackPanel> 
        <CheckBox> 
         <TextBlock Text="Next order" Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}, Path=Foreground}" /> 
        </CheckBox> 
        <CheckBox Content="Parts on order" /> 
       </StackPanel> 
      </Expander> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

的問題是,在本例中第一個複選框XAML沒有按」 t運行時顯示任何文本,而第二個顯示。當在兩個複選框上使用VS 2015的Live Property Explorer時,第一個在Computed Values/Templated Parent/Content下顯示Text屬性,第二個(顯示)將其文本顯示爲本地值。

我試過刪除綁定和樣式,看看他們是否有任何影響,但它仍然沒有顯示。

有沒有人有任何見識,爲什麼第一個TextBlock不顯示?

編輯: 爲了迴應人們的問題,它不只是前景色。使用VS2015的「Live Visual Tree」選擇器,沒有文字可供選擇。

看到這個截圖(或其剪斷): Selection of second item

選擇在可視化樹的第一個文本框顯示在應用程序中沒有邊界。另外,在文本所在的位置懸停不會讓我檢查框;點擊進入Expander。在正在運行的應用程序中移動鼠標似乎顯示在複選框旁邊顯示一個像素寬的區域,該區域確實允許與該框交互,在本來是TextBlock的開始處。就好像TextBlock沒有文字。

+0

是什麼live屬性瀏覽器說的價值第一個T extBlock的'Foreground'屬性是?它可能與單元格的背景顏色相同嗎? – kcnygaard

+0

嘗試從TextBlock中刪除Foreground屬性,並查看運行時是否出現文本。不要相信「Live Visual Tree」 - 我遇到過失敗的案例。有些東西並沒有加在這裏 - 使用TextBlock作爲CheckBox的內容對我來說工作得很好。 – user3690202

+0

我已經嘗試刪除樣式,甚至綁定從事物鏈到datagrid本身,文本塊沒有顯示。使用Snoop而不是VS2015進行檢查表明,textblock的所有值都是默認值(因此沒有文本)。也許這與WPF的Modern UI有關? – PrinceBilliard

回答

1

您可能正在使用白色前景,可能會使文本顯示爲白色,因此無法看到。

Screen shot when run

下面是代碼:

<Window x:Class="WpfDataGrid._32635114.Win32635114" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Win32635114" Height="300" Width="300"> 

    <Window.Resources> 
     <Style TargetType="DataGridCell" x:Key="WhiteForeground"> 
      <Setter Property="Foreground" Value="Red"/> 
     </Style> 

     <Style TargetType="Expander" x:Key="DisableExpander"> 
      <Setter Property="Background" Value="BurlyWood"/> 
     </Style> 

    </Window.Resources> 

    <StackPanel> 
     <DataGrid x:Name="MyGrid" Height="270" AutoGenerateColumns="False" ItemsSource="{Binding Values}"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Effectivity" CellStyle="{StaticResource WhiteForeground}"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Expander x:Name="EffectivityExpander" Header="{Binding EffectivityString}" Style="{StaticResource DisableExpander}" Foreground="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}"> 
           <StackPanel> 
            <CheckBox> 
             <TextBlock Text="Next order" Foreground="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}" /> 
            </CheckBox> 
            <CheckBox Content="Parts on order" /> 
           </StackPanel> 
          </Expander> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

    </StackPanel> 
</Window> 

MainWindow.cs

namespace WpfDataGrid._32635114 
{ 
    /// <summary> 
    /// Interaction logic for Win32635114.xaml 
    /// </summary> 
    public partial class Win32635114 : Window 
    { 
     public Win32635114() 
     { 
      InitializeComponent(); 

      DataStore store = new DataStore(); 
      this.DataContext = store; 
     } 
    } 
} 

DataStore.cs

namespace WpfDataGrid._32635114 
{ 
    public class DataStore 
    { 
     private List<Record> _values; 
     public List<Record> Values { get { return _values; } } 

     public DataStore() { 
      _values = new List<Record>(); 
      _values.Add(new Record() { EffectivityString = "somestring1" }); 
      _values.Add(new Record() { EffectivityString = "somestring2" }); 
      _values.Add(new Record() { EffectivityString = "somestring3" }); 
      _values.Add(new Record() { EffectivityString = "somestring4" }); 
     } 
    } 

    public class Record 
    { 
     public String EffectivityString { get; set; } 
    } 
}