2011-09-28 21 views
7

में कर्सर के साथ एक टूलटिप या कुछ समान कदम, क्या Tooltip या माउस के विशिष्ट नियंत्रण पर जाने पर कर्सर के साथ ऐसा कुछ स्थानांतरित करना संभव है?डब्ल्यूपीएफ

मैंने TextBlock की कोशिश की, लेकिन Margin संपत्ति काम नहीं करती है।

private TextBlock tooltip = new TextBlock(); 
    private void imgRoom_MouseEnter(object sender, MouseEventArgs e) 
    {   
     Point position = e.GetPosition((IInputElement)sender); 
     tooltip.Visibility = System.Windows.Visibility.Visible; 
     tooltip.Margin = new Thickness(position.X, position.Y, 0, 0);   
     tooltip.Width = 100; 
     tooltip.Height = 100; 
     tooltip.Background = new SolidColorBrush(Colors.Red); 
    } 

    private void imgRoom_MouseMove(object sender, MouseEventArgs e) 
    { 
     Point position = e.GetPosition((IInputElement)sender); 
     tooltip.Margin = new Thickness(position.X, position.Y, 0, 0); 
    } 
+0

अपना कोड दिखाएं और हम शायद आपके इरादे देखेंगे। –

+0

क्या आपका मतलब है कि आप माउस कर्सर के साथ टूलटिप को स्थानांतरित करना चाहते हैं ??? यदि हां, तो क्या यह टूलटिप के उद्देश्य को विफल नहीं करता है ?? – loxxy

+0

हां! आईआर टूलटिप के उद्देश्य में विफल: पी लेकिन मुझे कर्सर के साथ जाने के लिए कुछ समान टूलटिप चाहिए :) – Jalal

उत्तर

10

आप पॉपअप और कुछ सरल गुणों का उपयोग करके प्रभाव प्राप्त कर सकते हैं। विंडो कोड से ...

<Window x:Class="WpfApplication3.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
    <Rectangle Name="rect" Margin="50,50,0,0" Width="100" Height="100" Fill="LightBlue" MouseMove="Rectangle_MouseMove" MouseLeave="Rectangle_MouseLeave" /> 

    <Popup Name="floatingTip" AllowsTransparency="True" Placement="Relative" PlacementTarget="{Binding ElementName=rect}"> 
     <TextBlock>Look At Me</TextBlock> 
    </Popup> 
    </Grid> 

</Window> 

और यह कोडबीहाइंड जैसा दिखता है।

... 
private void Rectangle_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (!floatingTip.IsOpen) { floatingTip.IsOpen = true; } 

    Point currentPos = e.GetPosition(rect); 

    // The + 20 part is so your mouse pointer doesn't overlap. 
    floatingTip.HorizontalOffset = currentPos.X + 20; 
    floatingTip.VerticalOffset = currentPos.Y; 
} 

private void Rectangle_MouseLeave(object sender, MouseEventArgs e) 
{ 
    floatingTip.IsOpen = false; 
} 
... 

तो एक्सएएमएल से आप देख सकते हैं कि पॉपअप प्लेसमेंट आयताकार के सापेक्ष है। जब आप आयत पर मसाला करते हैं, तो यह दिखाई देता है, और इसकी स्थिति को माउस चाल के रूप में अपडेट किया जाता है। स्वाभाविक रूप से यह एक बहुत ही बुनियादी समाधान है, लेकिन कुछ मामूली tweaks के साथ, 'MouseEnter' और संपत्ति समायोजन जैसी घटनाओं को संभालने के साथ आप कुछ वास्तव में साफ प्रभाव के साथ आ सकते हैं।

+0

धन्यवाद! मैं जितनी जल्दी हो सके इसे कार्यान्वित करूँगा :) – Jalal

+2

दरअसल, आपको पॉपअप का उपयोग करके अपना खुद का फ़्लोटिंग टूलटिप बनाने की आवश्यकता नहीं है क्योंकि टूलटिप एक पॉपअप है।बस टूलटिप के क्षैतिज ऑफसेट और वर्टिकल ऑफसेट को वर्तमान माउस स्थिति पर सेट करें। – henon

2

मुझे नहीं पता कि यह एक सर्वोत्तम अभ्यास है, या यदि यह अच्छा प्रदर्शन करता है, लेकिन आप Adorner का उपयोग कर सकते हैं।

मैंने पहले अवधारणा का सबूत बनाया है, लेकिन इसे उत्पादन परिदृश्य में अभी तक उपयोग नहीं किया है (अभी तक)। एडॉर्नर का उपयोग इस तरह (टूलटिप), या एक कस्टम माउस कर्सर या ड्रॉप आइकन को बनाने के लिए किया जा सकता है।

सुनिश्चित करें कि आप IsHitTestVisible = false सेट करते हैं यदि सजावट को परीक्षण करने की आवश्यकता नहीं है और सीधे माउस स्थान के नीचे दिखाई दे सकता है।

अद्यतन

बस पूरी तरह से adorners का वर्णन पढ़ें: adorners के लिए

आम अनुप्रयोगों में शामिल हैं:

  • एक UIElement कि हेरफेर करने के लिए उपयोगकर्ता को सक्षम करने कार्यात्मक हैंडल जोड़ना किसी भी तरह से तत्व (आकार बदलें, घुमाएं, स्थानांतरित करें, आदि)।
  • विभिन्न राज्यों को इंगित करने के लिए दृश्य प्रतिक्रिया प्रदान करें, या विभिन्न घटनाओं के जवाब में।
  • UIElement पर ओवरले दृश्य सजावट।
  • विज़ुअल मास्क या ओवरराइड भाग या सभी UIElement।
0

यह माउस कर्सर के साथ चारों ओर टूलटिप ले जाता है।

private void OnMouseMoveHandler(object sender, MouseEventArgs args) 
    { 
     if ((sender as FrameworkElement).ToolTip == null) 
      (sender as FrameworkElement).ToolTip = new ToolTip() { Placement = PlacementMode.Relative }; 
     double x = args.GetPosition((sender as FrameworkElement)).X; 
     double y = args.GetPosition((sender as FrameworkElement)).Y; 
     var tip = ((sender as FrameworkElement).ToolTip as ToolTip); 
     tip.Content = tooltip_text; 
     tip.HorizontalOffset = x + 10; 
     tip.VerticalOffset = y + 10; 
    } 
+0

आप विभिन्न हैंडलर के साथ उस हैंडलर का उपयोग कैसे करते हैं? जैसे कि मेरे पास दो अलग-अलग बटन हैं जिन्हें इस कार्यक्षमता की आवश्यकता है? –

+0

यह एक्सएएमएल में परिभाषित टूलटिप टेक्स्ट के साथ काम नहीं करता है, यानी <टेक्स्टब्लॉक टूलटिप = "वाह"> सामग्री इसके अलावा, अगर मैं इस फैशन में टूलटिप को परिभाषित करता हूं, तो मैं यह सुनिश्चित कैसे करूं कि सामग्री ईवेंट हैंडलर में सही है? (tip.Content = ??) –

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

  • कोई संबंधित समस्या नहीं^_^