2012-01-13 29 views
5

Tôi đang phát triển UserControl bao gồm một khối có tiêu đề và danh sách các mục (như ItemsControl). Usercontrol được thêm động vào canvas. Tôi cần phải có được kích thước thực tế của kiểm soát (bao gồm cả không gian được thực hiện bởi ItemsControl) trước khi nó được trả lại. Tôi đã cố gắng ghi đè phương thức MeasureOverride của UserControl với hy vọng rằng kích thước sẽ được phản ánh trong thuộc tính DesiredSize. Nhưng nó không hoạt động.Cách ghi đè MeasureOverride để tìm kích thước của ItemsControl

Các XAML là:

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

Tôi trọng MeasureOverride của UserControl như hình dưới đây:

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ã Chủ đầu tư:

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

tôi không nhận được kích thước thực tế sử dụng tài sản DesiredSize.Height từ khách hàng. Còn ý tưởng nào để sửa cái này nữa không?

Trả lời

-1

Hãy thử sử dụng các thuộc tính ActualWidthActualHeight.

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

Điều này không hoạt động. – blitzkriegz

+1

ActualWidth và ActualHeight không có giá trị cho đến khi thẻ bố trí hoàn tất. – Jeff

1

Điều khiển người dùng của bạn có được xác định là thay đổi chiều cao để phản ánh kích thước nội dung không? Theo mặc định, điều khiển người dùng của bạn sẽ có kích thước cố định và không thay đổi chiều cao chỉ vì mục kiểm soát có nhiều mục nhập hơn.

Tôi nghĩ bạn cần phải thêm điều khiển người dùng của mình vào lưới trước khi đo lưới. Đây là cách tôi đo kiểm soát và dường như hoạt động tốt, ngay cả khi đo kiểm soát trực tiếp không hoạt động như trong trường hợp của bạn ...

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

Có, nó được thiết kế để thay đổi chiều cao dựa trên số lượng các phần tử. – blitzkriegz

+0

Tôi cần vẽ đường giữa các liên kết người dùng. Đó là lý do tôi đã thêm usercontrol vào canvas. Tôi đang cố gắng để có được chiều cao thực tế để xác định các điểm kết nối. – blitzkriegz

+0

Bạn có thể đề xuất bất kỳ phương pháp nào khác để vẽ các kết nối mà không sử dụng canvas không. – blitzkriegz

Các vấn đề liên quan