2011-05-10 123 views
25

我已經閱讀了很多這種問題的解決方案。他們每個人都不能解決我的問題。無論我將控制器放在哪個容器中,或者在控制器/容器上設置了哪些屬性,它都不會讓步。 我有一個內部控件的滾動查看器。當用戶在運行時調整大小時,我希望它可以隨窗口調整大小。我需要的只是錨點=頂部,底部,左側,右側。我不明白爲什麼這在WPF中如此難以捉摸,以及爲什麼需要涉及容器對象和各種財產分配來完成表單中的單個屬性。但是對於這個問題的每個解決方案仍然會導致我的控件始終處於設計時的大小,因爲窗口在運行時調整大小。在wpf中掌握動態控制大小的簡單方法是什麼?如何使控件在wpf中調整大小,錨點/碼頭屬性等效

+2

你能告訴我們你現在的XAML代碼? – svick 2011-05-10 20:59:08

+0

您可以嘗試寬度/高度=「*」和/或使用堆疊面板 – deathrace 2013-01-21 17:46:02

回答

5

控制系統需要伸展,這一切都應該有它:

<MyControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 

Stretch替代設置achors雙方各自的兩側。

有關面板的幫助,請參閱this overview。另請參閱documentation of the layout system

大多數控件自動拉伸,如果你有一個DataGrid應該舒展過,嘗試在Kaxaml本示例,它包含一個DataGrid和一個TextBlock足見其大小:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <DataGrid Name="grid"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Name}" Header="Name"/> 
       <DataGridTextColumn Binding="{Binding Tag}" Header="Occupation"/> 
      </DataGrid.Columns> 
      <FrameworkElement Name="Skeet" Tag="Programmer"/> 
      <FrameworkElement Name="Gravell" Tag="Programmer"/> 
      <FrameworkElement Name="Steve" Tag="Coffee Getter"/> 
     </DataGrid> 
     <TextBlock Grid.Row="1"> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{}{0}, {1}"> 
        <Binding ElementName="grid" Path="ActualWidth"/> 
        <Binding ElementName="grid" Path="ActualHeight"/> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </Grid> 
</Window> 

如果大小的窗口下DataGrid的ScrollBars應該出現。

+0

我試過每一種對齊設置的組合。每次控制嚴格保持其設計時間尺寸。必須有別的東西阻止它調整大小,我只是看不到。 – Mike 2011-05-12 15:02:47

+0

控件所在的面板必須提供邊界,否則它將無法伸展,scrollviewer不會這樣做,因爲它的整個目的是可以查看任何大小的控件,它們通常不會限制其內容。編輯:實際上它也適用於ScrollViewer,在某些情況下,它取決於控件。無論如何你使用的是什麼控制?其數據網格爲 – 2011-05-12 17:28:45

+0

。我試圖讓scrollviewer的大小調整到窗口的大小(或者窗口的可用大小,還有其他控件,但這是需要變大的那個),但是如果數據網格仍然太大,我希望scrollviewer提供一種方法來獲得越界內容。 – Mike 2011-05-12 18:56:14

4

我認爲不調整大小的控件是您的自定義控件。

  • 使用DockPanel作爲容器。
  • 從控件中刪除顯式寬度和高度屬性。

如果你在VS2008中工作,那麼這會造成不便,因爲在設計器中查看時,你的控件會崩潰到最小尺寸。

表達式混合和從VS2010開始都尊重設計器名稱空間,因此您可以指定設計時間只控制大小。

對於以下內容添加到您的控制:

<UserControl ... 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignWidth="WWW" d:DesignHeight="HHH"> 
    .... 
</UserControl> 

d:DesignWidth和d:DesignHeight指定設計時的寬度和高度。

+0

我試過把它放在停靠板上。在我看來,控制器將擴展到填充停靠面板,但無論窗口變得多大,DockPanel本身都保持相同的尺寸。 – Mike 2011-05-12 15:01:57

+0

我不小心投了票。我甚至沒有意識到我當時做到了。我想撤消它,但除非編輯答案,否則它不會讓我改變我的投票。 – TomDestry 2013-12-02 03:16:42

1

這個問題很舊,但自從我在這裏找到我以後,我想我會拋出我的解決方案。下面的代碼用於帶有兩個選項卡的選項卡控件,每個選項卡都包含一個用於填充選項卡的控件。我刪除了明確設置的寬度和高度,並將水平和垂直對齊設置爲在我想調整大小的所有控件上自動調整。選項卡控件通過主窗口延伸。選項卡中的控件伸展以填充選項卡。信息來自這裏的答案。我只是舉了一個完整的例子。

希望這對某人有用。

 <TabControl HorizontalAlignment="Stretch" 
       Margin="91,0,0,0" Name="tabControl1" 
       VerticalAlignment="Stretch" > 
     <TabItem Header="DataGrid" Name="tabItem1"> 
      <Grid> 
       <DataGrid AutoGenerateColumns="False" 
          HorizontalAlignment="Stretch" 
          Name="dgFTPLog" 
          VerticalAlignment="Stretch" 
          Margin="6,6,0,0" /> 
      </Grid> 
     </TabItem> 
     <TabItem Header="Log" Name="tabItem2"> 
      <Grid> 
       <TextBox 
         HorizontalAlignment="Stretch" 
         Margin="6,6,0,0" Name="txtLog" 
         VerticalAlignment="Stretch" 
         VerticalScrollBarVisibility="Auto" 
         HorizontalScrollBarVisibility="Auto" 
         TextChanged="txtLog_TextChanged" /> 
      </Grid> 
     </TabItem> 
    </TabControl> 
43

這也引起了我的悲痛,AlexK幫助我看到了光明。技巧是不設置高度和寬度....將它們設置爲AUTO並使用MARGIN來設置大小。將HORIZONTALALIGNMENTVERTICALALIGNMENT設置爲STRETCH,然後錨定功能起作用。

+0

這也適用於會面。你節省了我的一天。感謝:D – 2013-02-12 07:17:50

0

我也遇到過這個問題。 並嘗試綁定到父控件ActualHeight和ActualWidth屬性,除此之外,只有當您通過XAML後面的代碼執行時纔有效。

即 XAML

<MyParentControl x:name="parentControl" SizeChanged="parentControl_SizeChanged"> <ChildControl x:name=childControl" /> </MyParentControl>

代碼beind

private void parentControl_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     childControl.Height = parentControl.ActualHeight; 
     childControl.Width = parentControl.ActualWidth; 
    }