2009-11-08 13 views
35

मैं एक Grid एक Canvas इस तरह परिभाषित के अंदर है:इस मामले में वास्तविक विडियो और वास्तविक हाइट 0.0 क्यों हैं?

<Canvas x:Name="outerCanvas"> 
    <Grid Grid.Row="1" Name="cGrid" ShowGridLines="True" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}" Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Rectangle Name="rectangle1" Stroke="Black" Fill="AntiqueWhite" /> 
     <Rectangle Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle2" Stroke="Black" Fill="AliceBlue" /> 
     <Rectangle Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle3" Stroke="Black" Fill="Aqua" /> 
     <Rectangle Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="1" Name="rectangle4" Stroke="Black" Fill="DarkViolet" /> 
    </Grid> 
</Canvas> 

मेरे समस्या यह है कि, InitializeComponents() या तो Grid.ColumnDefinitions[0].ActualWidth या "किसी भी आयत" विंडो निर्माता पर, के बाद। ActualWidth सभी 0.0 पर सेट हैं (ऊंचाई के लिए समान)। मैं यह नहीं समझ रहा हूं कि यह जानकारी प्राप्त करने के लिए क्या करना है। कोई मदद?

टिप्पणियों:

  1. मैं बाहरी कैनवास चौड़ाई और ऊंचाई definig नहीं कर रहा हूँ, लेकिन अगर मैं करता हूँ, यह मेरी समस्या का समाधान शामिल नहीं है।
  2. क्रम मैं देख सकता हूँ कि इस Canvas/Grid पूरी विंडो स्थान घेरती है, तो यह अंदर हर आयत ActualWidth रों है और ActualHeight रों
  3. ग्रिड की चौड़ाई/ऊंचाई कैनवास के लिए बाध्य है, लेकिन मैं इस बंधन और मेरी समस्या को दूर करने की कोशिश की पर

उत्तर

69

ActualHeight और ActualWidth नियंत्रण को मापने और व्यवस्थित होने तक सेट नहीं किए जाते हैं। आम तौर पर InitializeComponent() में कुछ भी नहीं है जो माप का कारण बनता है, इसलिए जब यह लौटाता है तो यह शून्य होगा।

आप खिड़की के InitializeComponent() रिटर्न के बाद मैन्युअल रूप से विंडो के Measure() और Arrange() विधियों को कॉल करके इन्हें गणना करने के लिए मजबूर कर सकते हैं।

आप सामग्री के लिए आकार रहे हैं:

window.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height)); 

आप एक स्पष्ट विंडो का आकार उपयोग कर रहे हैं:

window.Measure(new Size(Width, Height)); 
window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height)); 
+1

धन्यवाद! बस थोड़ा सुधार: खिड़की। उपाय शून्य वापस आता है। यह DesiredWidth/DesiredHeight गुणों को बदलता है :) लेकिन आपका विचार सही है। –

+1

ऐसा तब होता है जब आप एपीआई को दोबारा जांचने के बिना अपने सिर के ऊपर से कोड टाइप करते हैं। सुधारों के लिए धन्यवाद। MeasureOverride आकार देता है, लेकिन माप बस उन्हें स्टोर करता है। उत्तर सही किया गया। –

+11

सुनिश्चित नहीं है कि "DesiredWidth" पहले काम करता था, लेकिन .NET के नए संस्करण DesiredSize.Width, और DesiredSize का उपयोग करते हैं।ऊंचाई –

52

रे सही (+1) है कि इस तथ्य के कारण है कि मापने और व्यवस्था की व्यवस्था अभी तक निष्पादित नहीं हुई है। हालांकि, के बजाय एक और लेआउट पास (महंगा) के लिए मजबूर, तुम बस जब तक अपने नियंत्रण ActualXxx गुण एक्सेस करने से पहले लोड होते ही इंतजार कर सकते हैं:

public MyWindow() 
{ 
    Loaded += delegate 
    { 
     // access ActualWidth and ActualHeight here 
    }; 

} 
+2

सहमत हैं। लोड की प्रतीक्षा आईएमएचओ बेहतर दृष्टिकोण है। –

+0

धन्यवाद! बस जिज्ञासा ... खिड़की पर कोई ऑनलोडेड विधि क्यों नहीं है? –

+3

लोड की प्रतीक्षा करना एक अच्छा विचार है (+1), और ज्यादातर मामलों में काम करेगा। लेकिन ध्यान दें कि जब आप किसी प्रस्तुति स्रोत से कनेक्ट नहीं होते हैं (यानी आप खिड़की कभी नहीं दिखाते हैं), लोड किए जाने को कभी नहीं कहा जाएगा। मैंने पहले इसमें भाग लिया है, उदाहरण के लिए जब किसी पृष्ठ पर नियंत्रण शामिल करना है या नहीं। तो मैं कहूंगा कि लोडेड का उपयोग करना बेहतर होता है जब यह संभव होता है और सभी मामलों को कवर करता है, अन्यथा माप/व्यवस्था का उपयोग करना बेहतर होता है। उस ने कहा, 9 0% मामलों में सर्वश्रेष्ठ अभ्यास वास्तविक वाइड/वास्तविक हूइट से दूर रहना होगा। (उदाहरण के लिए, अधिक/beter पैनल, ऊंचाई/चौड़ाई के लिए बाध्यकारी, MeasureOverride) –

-7

ActualWidth और ActualHeight, उपलब्ध XAML लोड हो रहा है पूरा करने के बाद ही कर रहे हैं लोड करने से पहले आप कैसे कर सकते हैं इन मानकों को ढूंढें?

लोड किए गए ईवेंट का उपयोग करें और इसके अंदर ActualWidth और ActualHeight खोजें।

private void me_Loaded(object sender, RoutedEventArgs e) 
{ 
    // do your stuffs here. 
} 
+6

जो कि केंट – kenny

+0

अवधारणा से ऊपर का जवाब था, वही उत्तर नहीं है –

-1

हमारे मामले में समाधान आसान था, के रूप में सभी ने कहा ActualWidth और ActualHeight के बाद भी पूरा करता है भरी हुई, तो हम बस एक डिस्पैचर में कोड लपेटा जाता है और नीचे के रूप में लोडेड को प्राथमिकता सेट कहा जाता है करने के लिए की जरूरत:

Dispatcher.Invoke(new Action(() => 
{ 
    graphHeight = ActualHeight; 
    graphWidth = ActualWidth; 
}), DispatcherPriority.Loaded); 

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

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