2012-01-13 14 views
5

के आकार को खोजने के लिए MeasureOverride को ओवरराइड करने के लिए कैसे मैं एक उपयोगकर्ता नियंत्रण विकसित कर रहा हूं जिसमें एक शीर्षक और एक सूची (ItemsControl) के साथ एक ब्लॉक शामिल है। उपयोगकर्ता नियंत्रण गतिशील रूप से कैनवास में जोड़ा जाता है। मुझे इसे प्रस्तुत करने से पहले नियंत्रण के वास्तविक आकार (ItemsControl द्वारा ली गई जगह सहित) प्राप्त करने की आवश्यकता है। मैंने UserControl की MeasureOverride विधि को ओवरराइड करने की कोशिश की है कि आकार DesiredSize संपत्ति में दिखाई देगा। लेकिन यह काम नहीं कर रहा है।आइटम्स कंट्रोल

XAML है:

<UserControl x:Class="MyTools.MyControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}">  
    <Grid x:Name="LayoutRoot" Background="White"> 
     <Border Name="MainBorder" CornerRadius="5" BorderThickness="2" BorderBrush="Black"> 
     <Grid Name="grid1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
      <Grid.RowDefinitions> 
       <RowDefinition Height="34" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <Grid Name="titleGrid" Grid.Row="0" Background="#FF727272"> 
       <TextBlock Name="titleText" HorizontalAlignment="Center" Text="{Binding ControlName}" VerticalAlignment="Center" FontSize="13" FontWeight="Bold" Foreground="Beige" /> 
      </Grid> 
      <Grid Name="gridpr" Grid.Row="1" Background="#12C48F35"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <Border Name="borderPr" CornerRadius="3" Margin="10" BorderThickness="1" BorderBrush="LightGray" Grid.Row="0"> 
       <Grid Name="gridPr" Background="#FFC1C1C1" MouseLeftButtonUp="gridPr_MouseLeftButtonUp"> 
        <StackPanel> 
         <TextBlock HorizontalAlignment="Center" Name="txtPr" Text="SubItems" VerticalAlignment="Center" Foreground="#FF584848" FontSize="12" /> 
         <ItemsControl x:Name="pitems" ItemsSource="{Binding MyItems}" > 
          <ItemsControl.ItemTemplate> 
          <DataTemplate> 
          <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="15,0,0,0"> 
           <TextBlock Text="{Binding MyVal}" /> 
          </StackPanel> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
         </ItemsControl> 
        </StackPanel> 
       </Grid> 
      </Border> 
     </Grid> 
     </Grid> 
     </Border> 
    </Grid> 
</UserControl> 

मैं UserControl के MeasureOverride अधिभावी कर रहा हूँ के रूप में नीचे दिखाया गया है:

namespace MyTools 
{ 
    public partial class MyControl : UserControl 
    { 
     public MyControl() 
     { 
      InitializeComponent(); 
     } 

     public string ControlName { get; set; } 
     public object MyItems { get; set; } 

     public class Row 
     { 
      public string MyVal { get; set; } 
     } 

     protected override Size MeasureOverride(Size availableSize) 
     { 
      var desiredSize = base.MeasureOverride(availableSize); 
      var sideLength = Math.Min(desiredSize.Width, desiredSize.Height); 

      desiredSize.Width = sideLength; 
      desiredSize.Height = sideLength; 

      return desiredSize; 
     } 
    } 
    } 

क्लाइंट कोड:

 MyControl control1 = new MyControl();   
     control1.ControlName = "Test Name"; 

     var test = new List<MyControl.Row>(
     new MyControl.Row[] 
      { 
       new MyControl.Row {MyVal = "Item1"}, 
       new MyControl.Row {MyVal = "Item2"}, 
       new MyControl.Row {MyVal = "Item3"} 
      }); 

     control1.MyItems = test; 

     control1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
     MessageBox.Show(control1.DesiredSize.Height.ToString()); 
     canvas1.Children.Add(control1); 

मैं वास्तविक आकार नहीं मिल रहा है ग्राहक से DesiredSize.Height संपत्ति का उपयोग कर। कुछ पता है इसे कैसे सुधारना?

उत्तर

-1

ActualWidth और ActualHeight गुणों का उपयोग करने का प्रयास करें।

protected override Size MeasureOverride(Size availableSize) 
{ 
    var desiredSize = new Size(); 
    var sideLength = Math.Min(ActualWidth, ActualHeight); 

    desiredSize.Width = sideLength; 
    desiredSize.Height = sideLength; 

    return desiredSize; 
} 
+0

यह काम नहीं कर रहा है। – blitzkriegz

+1

वास्तविक विडियो और वास्तविक हाइलाइट मान्य नहीं हैं जब तक एक लेआउट पास पूरा नहीं हो जाता है। – Jeff

1

क्या आपके उपयोगकर्ता नियंत्रण को सामग्री के आकार को दर्शाने के लिए ऊंचाई में बदलने के लिए परिभाषित किया गया है? डिफ़ॉल्ट रूप से आपका उपयोगकर्ता नियंत्रण एक निश्चित आकार होगा और ऊंचाई में नहीं बदला जाएगा क्योंकि आइटम नियंत्रण में अधिक प्रविष्टियां होती हैं।

मुझे लगता है कि ग्रिड को मापने से पहले आपको अपने उपयोगकर्ता नियंत्रण को ग्रिड के अंदर जोड़ना होगा। इस तरह मैं नियंत्रण को मापता हूं और यह अच्छी तरह से काम करता है, भले ही नियंत्रण को मापने से आपके मामले में काम न हो ...

MyControl control1 = new MyControl(); 

... your setup code for control1... 

Dim containerGrid As New Grid 
containerGrid.Children.Add(control1) 
containerGrid.Measure(New Size(Double.MaxValue, Double.MaxValue)) 
containerGrid.Arrange(New Rect(0, 0, Double.MaxValue, Double.MaxValue)) 

...now check the grid.ActualWidth and grid.ActualHeight 
+0

हां, यह तत्वों की संख्या के आधार पर ऊंचाई में बदलने के लिए डिज़ाइन किया गया है। – blitzkriegz

+0

मुझे usercontrols के बीच लाइनों को आकर्षित करने की आवश्यकता है। यही वजह है कि मैं कैनवास में उपयोगकर्ता नियंत्रण जोड़ रहा था। मैं कनेक्शन बिंदु निर्धारित करने के लिए वास्तविक ऊंचाई प्राप्त करने की कोशिश कर रहा हूं। – blitzkriegz

+0

क्या आप कैनवास के बिना कनेक्शन ड्राइंग के लिए कोई अन्य विधि सुझा सकते हैं। – blitzkriegz

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