2011-11-22 21 views
6

पर खाली टूलटिप्स को रोकें मैं कैलेंडर प्रोग्राम पर काम कर रहा हूं, जिसमें मुख्य रूप से एक WPF DataGrid शामिल है। चूंकि एक दिन की सभी प्रविष्टियों को प्रदर्शित करने के लिए हमेशा पर्याप्त जगह नहीं होती है (जो DataGridCell है), दिन के खोल की सभी प्रविष्टियों के साथ एक टूलटिप माउस पर दिखाई देता है। यह नीचे दिखाए गए कोड स्निपेट के साथ अब तक काम करता है। और अब (छोटी) समस्या: यदि किसी दिन के लिए कोई प्रविष्टियां नहीं हैं, तो कोई टूलटिप खोल पॉप अप नहीं होता है। एक खाली टूलटिप के नीचे दिए गए कोड के साथ पॉप अप।wpf डेटाग्रिड

<DataGridTemplateColumn x:Name="Entry" 
         IsReadOnly="True"> 
    <DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <Grid> 
     <TextBlock Text="{Binding EntryText}" 
        Foreground="{Binding EntryForeground}" 
        FontWeight="{Binding EntryFontWeight}"> 
     </TextBlock> 
     <TextBlock Text="{Binding RightAlignedText}" 
        Foreground="Gray"  
        Background="Transparent"> 
      <TextBlock.ToolTip> 
      <TextBlock Text="{Binding AllEntriesText}"/> 
      </TextBlock.ToolTip> 
     </TextBlock> 
     </Grid> 
    </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Databinding के पीछे है, जहां एक 'दिन' एक कैलेंडर पंक्ति के लिए दृश्य मॉडल है कोड में के माध्यम से

myCalDataGrid.Itemssource = _listOfDays; 

किया जाता है।

उत्तर

11

एचबी के रूप में।

<TextBlock Text="{Binding RightAlignedText}" 
      Foreground="Gray"  
      Background="Transparent" 
      ToolTip="{Binding AllEntriesText}"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
     <Style.Triggers> 
      <Trigger Property="ToolTip" 
        Value="{x:Static system:String.Empty}"> 
       <Setter Property="ToolTipService.IsEnabled" Value="False" /> 
      </Trigger> 
     </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

नाम स्थान जोड़ने के लिए सुनिश्चित करें - सुझाव बाँध के बजाय सीधे मामले AllEntriesText में TextBlock और का उपयोग करने का ToolTip संपत्ति के लिए रिक्त स्ट्रिंग आप इस तरह संपत्ति ToolTipService.IsEnabled सेट करके अपने टूलटिप निष्क्रिय करने के लिए अपने TextBlock पर एक ट्रिगर लागू कर सकते हैं आपके xaml में सिस्टम -

xmlns:system="clr-namespace:System;assembly=mscorlib" 
+0

जवाब के लिए धन्यवाद। मैं इसे देख लूंगा और एक रिपोर्ट दूंगा। – TheCalendarProgrammer

+1

अच्छा जवाब, एक आकर्षण की तरह काम करता है। – Mark

4

बाइंड सीधे ToolTip संपत्ति के लिए (इसके लिए एक TextBlock का निर्माण नहीं करतीं) और null को AllEntriesText सेट करता है, तो कोई एंट्री नहीं है, तो ToolTip खुद भी रिक्त है और नहीं दिखाना चाहिए।

2

समाधान के लिए धन्यवाद, वे काम कर सकते हैं, कोई सवाल नहीं। लेकिन टेक्स्ट को प्रारूपित और संरेखित करने के लिए टूलटिप के लिए मुझे टेक्स्टब्लॉक की आवश्यकता है।

<TextBlock Text="{Binding RightAlignedText}" 
      HorizontalAlignment="Stretch" 
      TextAlignment="Right" Padding="2,0" 
      Foreground="Gray"  
      Background="Transparent" 
      ToolTipService.ShowDuration="60000" 
      ToolTipService.BetweenShowDelay="0" 
      ToolTipService.InitialShowDelay="0" 
      > 
     <TextBlock.ToolTip> 
      <ToolTip Visibility="{Binding EntryToolTipVisibility}"> 
       <TextBlock Text="{Binding ToolTipText}" 
          TextAlignment="Left" 
          FontFamily="Courier New"/> 
      </ToolTip> 
     </TextBlock.ToolTip> 

    </TextBlock> 

मैं propertie एक propertie "EntryToolTipVisibility" के लिए टूलटिप की "दृश्यता" बाध्य (प्रकार दृश्यता का) दृश्य मॉडल में: तो मैं इस समाधान मिल गया। नीचे कोड स्निपेट देखें।

public Visibility EntryToolTipVisibility 
{ 
    get 
    { 
     return _entries.Count > 0 ? Visibility.Visible : Visibility.Collapsed; 
    } 
} 
0

एक और विकल्प अपने कनवर्टर का उपयोग करना है। मैं टेक्स्टब्लॉक टूलटिप के लिए उदाहरण के लिए इस तरह से पसंद करता हूं जो टेक्स्टब्लॉक के टेक्स्ट को प्रदर्शित करता है, लेकिन मामले में कोई टेक्स्ट नहीं है, तो खाली टूलटिप वांछित नहीं है।

XAML कोड:

//step #1 
xmlns:local="clr-namespace:MyNamespace" 

//step #2 - into Window.Resources or other 
<local:StringToVisibleTooltip x:Key="StringToVis" /> 


//step #3 - example of use 
<TextBlock ...other attributes... TextTrimming="CharacterEllipsis">               
    <TextBlock.ToolTip> 
      <ToolTip Visibility="{Binding Path=Text, Converter={StaticResource StringToVis}}"> 
        <TextBlock Text="{Binding Text}"/>         
       </ToolTip> 
     </TextBlock.ToolTip> 
</TextBlock> 

और कोड पीछे

namespace MyNamespace 
    { 
    public class StringToVisibleTooltip : IValueConverter 
    { 

     public StringToVisibleTooltip() { } 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value != null && ((string)value).Length > 0) //empty string does not need tooltip 
       return Visibility.Visible; 
      else 
       return Visibility.Collapsed; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return null; 
     } 
    } 
    } 
संबंधित मुद्दे