2013-05-15 5 views
9

मेरे पास एक कस्टम टूलटिप शैली है जो मूल रूप से आपके द्वारा रखे गए आइटम के स्थान पर इंगित करने वाले तीर के साथ एक अच्छा काला टूलटिप बनाता है।डब्ल्यूपीएफ: कस्टम टूलटिप तीर प्लेसमेंट

समस्या यह है कि कभी-कभी टूलटिप हमेशा सही स्थान (यानी खिड़की किनारों के नजदीक) में नहीं रखा जाएगा जिसका अर्थ है कि टूलटिप तीर अब सही जगह पर इंगित नहीं करता है ... क्या इस समस्या के आसपास वैसे भी है? या क्या मैं प्रत्येक स्थान नियुक्ति के लिए विशिष्ट शैलियों का निर्माण कर सकता हूं?

<Style x:Key="{x:Type ToolTip}" TargetType="ToolTip"> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="HasDropShadow" Value="True"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ToolTip"> 
       <StackPanel> 
        <Border CornerRadius="3" HorizontalAlignment="Center" VerticalAlignment="Top" Padding="10,7" BorderThickness="0" Background="#e5323232"> 
         <StackPanel> 
          <TextBlock FontFamily="Arial" FontSize="12" Text="{TemplateBinding Content}" Foreground="#f0f0f0" /> 
         </StackPanel> 
        </Border> 
        <Path Margin="10,0,0,0" Fill="#e5323232" Data="M 0 0 L 6 6 L 12 0 Z"/> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
+0

माउस कर्सर या नियंत्रण के केंद्र पर आपको टूलटिप कहां रखा जाना चाहिए? –

+0

मैं आदर्श रूप से तीर को क्षैतिज रूप से एक अलग स्थिति में रखा जाना पसंद करता हूं जैसे कि यह हमेशा टूलटिप वाले नियंत्रण/पाठ के केंद्र की ओर इशारा करता है। – Chris

+0

@Chris यह दिखाया गया उपयोग केस के समान कुछ था http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/4c6d216a-0011-4202-aa7e-2fccef3cc355 उस थ्रेड में समस्या हो सकती है वर्कअराउंड के साथ संबोधित http://stackoverflow.com/questions/15110410/determining-which-custompopupplacement-was-used-for-wpf-popup – Viv

उत्तर

1

हो सकता है कि आप इस की कोशिश कर सकते, मैं सिर्फ Center को Placement सेट और तीर आप टेम्पलेट में बनाया मैच के लिए एक HorizontalOffset गयी।

हालांकि कि अभ्यस्त, नियंत्रण पर खड़ी यह केंद्र ताकि आप एक IValueConverter बनाने के लिए और 2 से नियंत्रण और विभाजन के आकार की गणना कर सकते हैं या आप अपने StackPanel को एक डमी तत्व जोड़ सकता है सीमा के रूप में एक ही आकार है कि , और कहा कि पीछे

<Style x:Key="{x:Type ToolTip}" TargetType="ToolTip"> 
     <Setter Property="OverridesDefaultStyle" Value="true"/> 
     <Setter Property="HasDropShadow" Value="True"/> 
     <Setter Property="Placement" Value="Center" /> 
     <!--Offset to the arrow path--> 
     <Setter Property="HorizontalOffset" Value="15"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ToolTip"> 
        <StackPanel> 
         <Border x:Name="border" CornerRadius="3" HorizontalAlignment="Center" VerticalAlignment="Top" Padding="10,7" BorderThickness="0" Background="#e5323232"> 
          <StackPanel> 
           <TextBlock FontFamily="Arial" FontSize="12" Text="{TemplateBinding Content}" Foreground="#f0f0f0" /> 
          </StackPanel> 
         </Border> 
         <Path Margin="10,0,0,0" Fill="#e5323232" Data="M 0 0 L 6 6 L 12 0 Z"/> 

         <!--Dummy rectangle same height as tool tip, so it centers on the control--> 
         <Rectangle Height="{Binding ActualHeight, ElementName=border}" /> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

हाय, उत्तर के लिए धन्यवाद लेकिन यह कुछ भी बदलने के लिए प्रतीत नहीं होता? क्या मैं कुछ भूल रहा हूँ? – Chris

0

यह एक UIElement कि टूलटिप के PlacementTarget के रूप में नियंत्रण ट्री में मौजूद है उपयोग करने के लिए है ऐसा करने का सबसे आसान तरीका है किसी भी कोड की जरूरत के बिना ToolTip केंद्रित हो जाएगा। इस मामले टूलटिप LayoutRoot तत्व की उत्पत्ति पर हमेशा तैनात किया जाएगा

  <StackPanel ToolTipService.ToolTip="{Binding Title, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" 
         ToolTipService.Placement="Bottom" 
         ToolTipService.PlacementTarget="{Binding ElementName=LayoutRoot}">     
       <TextBlock Text="{Binding Title,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 
      </StackPanel> 

: जब आप विंडो के किनारों के पास मिलता है यह सिल्वरलाइट स्वचालित स्थिति से बचने जाएगा। यदि आपके पास एक निश्चित पथ आकार है और प्लेसमेंट लक्ष्य हमेशा उस स्थिति के सापेक्ष एक ही स्थिति में है जिसके लिए आप टूलटिप दिखाना चाहते हैं तो यह ठीक काम करता है।

यदि आपको टूलटिप को अपेक्षाकृत नियंत्रण में रखना है जो टूलटिप को ट्रिगर करता है, तो आपको पथ डेटा गतिशील बनाना होगा और टूलटिप नियंत्रण में हर बार टूलटिप नियंत्रण में नया पथ डेटा बनाने के लिए दूरी की गणना करना होगा। इस मामले के लिए आपको Tooltip.IsOpened ईवेंट को संभालना होगा और इस तर्क को लागू करना होगा। यदि आप नियुक्ति लक्ष्य का उपयोग कर रहे हैं, तो आप हमेशा अपने नियंत्रण के लिए अपेक्षाकृत दिशा को जानते हैं, जिससे पथ पथों की गणना करना आसान हो जाता है।

एक और तरीका जो काम करता है लेकिन यह आपके स्वयं के पॉपअप को लागू करने के लिए और अधिक जटिल है, जब आप माउस को अपने नियंत्रण में ले जाते हैं। नियंत्रण के सापेक्ष पॉपअप की स्थिति प्राप्त करने के लिए आपको कुछ गणनाओं को लागू करने की आवश्यकता होगी, जो टूलटिप नियंत्रण आपके लिए बिल्कुल सही है। इसका लाभ यह है कि टूलटिप और इसकी उपस्थिति की स्थिति पर आपका पूरा नियंत्रण है।

संबंधित मुद्दे