2010-01-12 17 views
13

इसलिए मुझे प्रक्रियात्मक रूप से ग्रिड के लिए पृष्ठभूमि छवि उत्पन्न करने की आवश्यकता है, यह केवल .1sec लेता है।wpf आकार बदलना

तो मैं साइज चेंजेड इवेंट में वायर कर सकता हूं, लेकिन फिर जब आप चार्ट का आकार बदलते हैं, तो यह जाता है और 30 सेकंड प्रति सेकंड भी आग लग जाता है, इसलिए आकार बदलने का घटना स्पष्ट रूप से सामने आती है।

क्या किसी को आकार बदलने की घटना में तार लगाने का एक अच्छा तरीका पता है और मौसम का परीक्षण आकार बदल रहा है, मैंने बस माउस अप/डाउन स्टेटस की जांच करने की कोशिश की, लेकिन जब आकार बदलने की घटना माउस को हमेशा नीचे रखती है ।

+0

छवि की प्रकृति क्या है? क्या यह एक रास्टर या वेक्टर छवि है? इसका कारण यह है कि आप जो करने की कोशिश कर रहे हैं उसकी प्रकृति के आधार पर एक बेहतर दृष्टिकोण हो सकता है। – codekaizen

+0

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

+0

@ जोएल बरसोट्टी: सबसे अच्छा समाधान "जनरेट इमेज()" को आकारबद्ध ईवेंटशेलर –

उत्तर

21

आकार बदलने पर, आप एक छोटे से रहने वाले टाइमर (100 एमएसईसी कहें) शुरू कर सकते हैं, प्रत्येक आकार रीसेट पर टाइमर इसे समाप्त होने से रोकने के लिए। जब अंतिम आकार बदलता है, तो टाइमर समाप्त हो जाएगा, और फिर आप अपनी पृष्ठभूमि छवि खींच सकते हैं।

उदाहरण:

Timer resizeTimer = new Timer(100) { Enabled = false }; 

public Window1() 
{ 
    InitializeComponent(); 
    resizeTimer.Elapsed += new ElapsedEventHandler(ResizingDone); 
} 

void ResizingDone(object sender, ElapsedEventArgs e) 
{ 
    resizeTimer.Stop(); 
    GenerateImage(); 
} 

private void Window_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    resizeTimer.Stop(); 
    resizeTimer.Start(); 
} 
+1

में दो बार कॉल करना है, यह एक हैक की तरह थोड़ा लगता है, लेकिन हे एक हैक जो काम करता है वह बहुत बेहतर है जो प्राचीन कोड टूटता है। –

+1

@ जोएल, मुझे लगता है कि यह एकमात्र आसान तरीका है, क्योंकि खिड़की का आकार वास्तव में विंडो क्रोम द्वारा किया जाता है जो मूल विंडो में डब्ल्यूपीएफ का हिस्सा नहीं है, इसलिए आपको इस तरह के माउस अप ईवेंट के साथ काम करने के लिए नहीं मिलेगा। वैकल्पिक रूप से अपनी खिड़की क्रोम बनाने के लिए, सीमाओं के बिना खिड़की की अपनी शैली और अपनी शैली में आपको पूरे विंडो फ्रेम को फिर से बनाने और माउस घटनाओं के कोड को लिखने की आवश्यकता होगी। –

+0

मैं सबसे आसान, हैक या नहीं, अगर कोड की 10 लाइनें लगभग समान हैं और 1000 लाइनें हैं, तो मैं हर बार 10 लाइनें ले जाऊंगा। –

0

आप छवि का आकार बदलने को देखने की जरूरत है? आप आकार को संभालने और माउस अप ईवेंट पर छवि को फिर से प्रस्तुत कर सकते हैं।

+0

यह मेरा पहला विचार था, लेकिन जब मैंने कोशिश की तो मैं सही माउसअप घटना को पकड़ने का तरीका नहीं समझ पाया, मैं एक WPF newb का प्रकार हूं और मैं किसी एल्स कोड में बंदर हूं। जिस कोड पर मैं काम कर रहा था उसे किसी अन्य ऑब्जेक्ट के अंदर एक बच्चे तत्व के रूप में डाला गया है। मैं समझता हूं कि बुलबुले और सुरंगों को घुमावदार घटनाएं हैं, मुझे जो करना है वह सुरंग संस्करण को पकड़ना है।मेरी समझ यह है कि उन घटनाओं में आम तौर पर एक पूर्वावलोकन उपसर्ग होता है, और मैंने माउस बाउंडबूटनअप के लिए एक नहीं देखा। –

+0

अच्छी तरह से मैंने पाया। .PviewMouseLeftButtonUpEvent घटना, लेकिन जब मैं आकार बदल रहा हूं तो यह आग लगती नहीं है। –

2

नेट 3.5 और बाद में पीट ब्राउन describes मिश्रण प्रणाली का उपयोग कर संलग्न संपत्ति के साथ एक समाधान। Windows.Interactivity.dll।

वहां आप अपनी छवि को उत्पन्न करना बंद करने के लिए आकार बदलने का आयोजन कर सकते हैं और आकार बदलकर ईवेंट नए आकार के लिए छवि उत्पन्न करना शुरू कर सकता है।

HTH

0

बेस्ट समाधान sizechanged eventhandler

1

मैं Dispatcher.BeginInvoke विधि का प्रयोग करेंगे में "GenerateImage()" दो बार फोन करने के लिए है। इससे यह सुनिश्चित होगा कि आपकी छवि केवल तब उत्पन्न होती है जब एप्लिकेशन को संसाधित करने का समय होता है।

private const int WmExitSizeMove = 0x232; 

private void OnLoaded(object sender, RoutedEventArgs args) 
{ 
    var helper = new WindowInteropHelper(this); 
    if (helper.Handle != null) 
    { 
     var source = HwndSource.FromHwnd(helper.Handle); 
     if (source != null) 
      source.AddHook(HwndMessageHook); 
    } 
} 

private IntPtr HwndMessageHook(IntPtr wnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    switch (msg) 
    { 
     case WmExitSizeMove: 
      // DO SOMETHING HERE 
      handled = true; 
      break; 
    } 
    return IntPtr.Zero; 
} 

गुड लक:

private bool _generateImageReqested = false; 

private void Window_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    if (!_generateImageReqested) 
    { 
     _generateImageReqested = true; 
     Dispatcher.BeginInvoke(new Action(GenerateImage), DispatcherPriority.ApplicationIdle); 
    } 
} 

private void GenerateImage() 
{ 
    _generateImageReqested = false; 

    // resize your image here 
} 
संबंधित मुद्दे