2012-01-13 41 views
5

Bir başlık ve bir öğeler listesi (ItemsControl olarak) içeren bir UserControl geliştiriyorum. Usercontrol, bir tuvale dinamik olarak eklenir. İşlenmeden önce kontrolün gerçek boyutunu (ItemsControl tarafından çekilen alan dahil) almam gerekiyor. Boyutu DesiredSize özelliğinde yansıtılacak umuduyla UserControl'ün MeasureOverride yöntemini geçersiz kılmayı denedim. Ama bu çalışmıyor.ItemsControl öğesinin boyutunu bulmak için MeasureOverride nasıl geçersiz kılınır

XAML: Ben UserControl MeasureOverride geçersiz kılma am

<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> 

aşağıda gösterildiği gibi:

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; 
     } 
    } 
    } 

Müşteri Kodu:

 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); 

Ben gerçek boyutunu almıyorum istemciden DesiredSize.Height özelliğini kullanarak. Bunu nasıl düzelteceğinizle ilgili bir fikrin var mı?

cevap

-1

ActualWidth ve ActualHeight özelliklerini deneyin.

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

... olduğunu. – blitzkriegz

+1

ActualWidth ve ActualHeight bir düzen geçişi tamamlanana kadar geçerli değildir. – Jeff

1

Kullanıcı denetiminizin, içeriğin boyutunu yansıtacak şekilde yükseklik olarak tanımlanması tanımlandı mı? Varsayılan olarak, kullanıcı kontrolünüz sabit bir boyutta olacak ve öğeler kontrolünün daha fazla girişi olduğu için yükseklik değiştirmeyecektir.

Kullanıcı kılavuzunuzu bir kılavuza eklemeden önce ızgarayı ölçmeniz gerektiğini düşünüyorum. Ben kontrollerini ölçmek ve olduğu gibi çalışmaz doğrudan kontrol ölçme dahi o, iyi iş gibi görünüyor nasıl This çalışmıyor

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

Evet, öğe sayısına bağlı olarak yüksekliği değiştirmek için tasarlanmıştır. – blitzkriegz

+0

Kullanıcı kontrolleri arasında çizgiler çizmem gerekiyor. Kullanıcı kontrolünü tuvale eklememin sebebi budur. Bağlantı noktalarını belirlemek için Gerçek Yüksekliğe ulaşmaya çalışıyorum. – blitzkriegz

+0

Tuval kullanmadan bağlantı çizmek için başka herhangi bir yöntem önerebilir misiniz? – blitzkriegz

İlgili konular