2012-10-18 56 views
0

我有一個WPF應用程序,我正在測試哪一個加載XML並在用戶控件中將其可視化。現在我遇到的問題是,每次我加載我的用戶控件時,HorizontalAlignment都沒問題,但VerticalAlignment並不熟悉usercontrol的高度大小。WPF用戶控件超出網格範圍

任何人有一個想法如何解決這個問題?

MainWindow.xaml

 <Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:UserControls="clr-namespace:RackBuildingTesT.UserControls" x:Class="RackBuildingTesT.MainWindow" 
    Title="MainWindow" Height="578" Width="758" SizeChanged="Window_SizeChanged_1"> 
<Grid> 
     <DockPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <Border DockPanel.Dock="Top" BorderBrush="Black" BorderThickness="1"> 
       <Grid> 
        <Label Content="Welke rack laden" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
        <ComboBox x:Name="RackChooser" HorizontalAlignment="Left" Margin="100,0,0,0" VerticalAlignment="Top" Width="120" SelectionChanged="RackChooser_SelectionChanged"/> 
       </Grid> 
      </Border> 
     <Border DockPanel.Dock="Top" BorderBrush="Black" BorderThickness="1"> 
      <Grid x:Name="RackGrid" Margin="0,0,0,0"> 
      </Grid> 
     </Border> 
     </DockPanel> 
    </Grid> 

MainWindow.xaml.cs

 public MainWindow() 
    { 
     InitializeComponent(); 
     LoadRackCombo(); 
    } 
    private void LoadRackCombo() 
    { 
     var files = Directory.GetFiles(Properties.Settings.Default.FilePathXMLRack); 
     foreach (var item in files) 
     { 
      RackChooser.Items.Add(item); 
     } 
    } 

    private void RackChooser_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     this.RackGrid.Children.Clear(); 
     this.Cursor = Cursors.Wait; 
     if (RackChooser.SelectedIndex == -1) 
      MessageBox.Show("Select a rack"); 
     else 
     { 
      string rackFile = Convert.ToString(RackChooser.Items[RackChooser.SelectedIndex]); 
      UserControls.RackBuilder r = new UserControls.RackBuilder(); 
      RackGrid.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
      RackGrid.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; 
      r.Width = RackGrid.Width; 
      r.Height = RackGrid.Height; 
      var _r = TRack.CreateFromXMLFile(rackFile, null); 
      r.set_Rack(_r); 
      RackGrid.Children.Add(r); 
     } 
     this.Cursor = Cursors.Arrow; 
    } 

    private void Window_SizeChanged_1(object sender, SizeChangedEventArgs e) 
    { 
     RackGrid.Width = this.Width; 
     RackGrid.Height = this.Height; 
    } 

RackBuilder.xaml.cs(XAML頁面是標準WPF用戶控件)

 public RackBuilder() 
    { 
     InitializeComponent(); 
    } 

    public TRack fRack { get; set; } 

    public void set_Rack(TRack value) 
    { 
     this.fRack = value; 
     this.InvalidateVisual(); 
    } 

    protected override void OnRender(DrawingContext drawingContext) 
    { 
     if (this.fRack != null) 
     { 
      var xScale = this.Width/this.fRack.Size.Width; 
      var yScale = this.Height/this.fRack.Size.Height; 
      var smallest = 0.0; 

      if (xScale < yScale) 
       smallest = xScale; 
      else 
       smallest = yScale; 

      foreach (var hole in this.fRack.HolePositions) 
      { 
       drawingContext.DrawEllipse(Brushes.Aquamarine, null, new Point(hole.Position.X * xScale, hole.Position.Y * yScale), 
              hole.Diameter * smallest * 0.5, hole.Diameter * smallest * 0.5); 
      } 
     } 
    } 

結果

Result of App

回答

0

我修正了將MainWindow SizeToContent設置爲WidthAndHeight

0

而不是增加你的控制到Grid的,使用ContentControl並將其添加到它的內容屬性。 它也自動延伸其孩子。

+0

仍然有相同的問題 –

+0

我複製了你的xaml代碼,它的行爲和預期的一樣。確保您不要在代碼隱藏或UserControls xaml代碼中操縱RackBuilders高度和寬度。 –