2010-06-30 22 views
18

Mam aplikację wpf z kilkoma formularzami. W czasie projektowania są małe i nie są ustawione na rozmiar automatyczny. Jednak w czasie pracy są gigantami, nawet bez zawartości, aby je powiększyć.Dlaczego moje rozmiary okien WPF domyślnie są ogromne?

Dlaczego tak się dzieje?

Oto jedna z form

<Window x:Class="SuperPluginPicker" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:tree="clr-namespace:Aga.Controls.Tree;assembly=Aga.Controls" 
      mc:Ignorable="d" 
      d:DesignHeight="296" d:DesignWidth="634" Title="Plugin Selector" WindowStartupLocation="CenterOwner"> 
    <Grid> 
     <DockPanel LastChildFill="true"> 
      <StackPanel DockPanel.Dock="Bottom" Height="30" Orientation="Horizontal"> 
       <Button Content="Ok" Name="btnOk" Click="btnOk_Click"></Button> 
       <Button Content="Cancel" Name="btnCancel" Click="btnCancel_Click"></Button> 

      </StackPanel> 
      <StackPanel DockPanel.Dock="Right"> 
       <Label Content="Selected Plugins"></Label> 
      <ListBox Name="lstSelectedPlugins" Width="200"> 
       <ListBox.ItemTemplate> 



        <DataTemplate> 



         <Label Content="{Binding Name}" /> 

        </DataTemplate> 

       </ListBox.ItemTemplate> 

      </ListBox> 
      </StackPanel> 
      <StackPanel DockPanel.Dock="Right" Width="100" VerticalAlignment="Center"> 
       <Button Content="Add" Name ="btnAdd" Click="btnAdd_Click"></Button> 
       <Button Content="Remove" Name="btnRemove" Click="btnRemove_Click"></Button> 
       <Button Content="Remove All" Name="btnRemoveAll" Click="btnRemoveAll_Click"></Button> 
      </StackPanel> 

      <tree:TreeList x:Name="pluginTree"> 
       <tree:TreeList.View> 
        <GridView x:Name="treeGrid"> 
         <GridView.Columns> 

          <GridViewColumn Width="Auto" Header="Name"> 
           <GridViewColumn.CellTemplate> 
            <DataTemplate> 
             <StackPanel Orientation="Horizontal"> 
              <tree:RowExpander/> 

              <TextBlock Text="{Binding Name}"></TextBlock> 
             </StackPanel> 
            </DataTemplate> 
           </GridViewColumn.CellTemplate> 
          </GridViewColumn> 
          <GridViewColumn Header="Author" Width="Auto" DisplayMemberBinding="{Binding Author}"/> 
          <GridViewColumn Header="Description" Width="Auto" DisplayMemberBinding="{Binding Type}"/> 


         </GridView.Columns> 
        </GridView> 
       </tree:TreeList.View> 
      </tree:TreeList> 
     </DockPanel> 
    </Grid> 
</Window> 
+0

Jakiego rozmiaru są one w czasie wykonywania? 634x296? –

+0

im działa w trybie panoramicznym 1900 x 1280, a okno pozostawia około 1/2 cala po obu stronach ekranu. (dobrze 1/2 cala na górze po lewej i na dole, może 2 cale po prawej.ale nadal bardzo duży) –

+0

możliwy duplikat [rozmiaru okna, gdy SizeToContent nie jest określony] (http://stackoverflow.com/questions/1437099/window-size-when-sizetocontent-is-not-specified) – paxdiablo

Odpowiedz

32

Jeśli utworzysz <Window/> z tego kodu:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" /> 

Następnie po uruchomieniu że z Visual Studio będzie wyświetlenie okna tej samej wielkości jak ten można umieścić w swoim pytaniu. Więc nie jest to coś, co wyraźnie zrobiłeś.

To, co napotkano, to domyślny obliczony rozmiar pliku WPF Window. Dla różnych wyników, należy określić parametr SizeToContent na oknie, jak paxdiablo wskazał, albo jawnie ustawić rozmiar okna z MinHeight, MaxHeight, Height, MinWidth, MaxWidth i/lub Width właściwości.

+0

Bardzo jasna, dobrze napisana i dokładna odpowiedź. +1. –

+3

Nawiasem mówiąc, jeśli utworzysz okno w MFC, Win32 lub Win16 odkryjesz, że dostajesz ten sam domyślny rozmiar. Na przykład kod Win32 'CreateWindow (szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);' wyświetla okno o tym samym rozmiarze co WPF. WPF nie wybiera domyślnego rozmiaru: Windows robi to sam, używając algorytmu, który pozostał prawie taki sam od czasu wydania Windows 2.0 w 1987 roku. –

+0

To jest obliczone na podstawie podstawowego ekranu, a następnie, prawda? –

7

Dlaczego nie można po prostu dodać:

Height="296" Width="634" 

definicji Window? Nie jestem pewien, skąd pochodzi domyślny rozmiar, ale ustawiłem określone rozmiary w moich oknach, aby ominąć to. Następnie dynamicznie zmieniam rozmiar w kodzie uruchamiania aplikacji.

Mam nadzieję, że WPF będzie miał funkcję podobną do pack, w której rekursywnie ustawia elementy sterujące na podstawie preferowanych rozmiarów pod-kontroli (Swing i wxPython mają tę funkcję), więc możesz chcieć tego szukać .


Faktycznie, trochę poszukiwań okazało się właściwość Window.SizeToContent która może być to, czego szukasz. Jego domyślną wartością jest Manual, ale jeśli ustawisz ją na jedną z innych wartości (Width, Height lub WidthAndHeight), możesz zobaczyć lepszą prezentację.

W rzeczywistości, po prostu ponacinane nad do laptopa z systemem Windows i weszły:

SizeToContent="WidthAndHeight" 

do definicji okna i wygląda doskonale wielkości. Sugeruję więc, aby spróbować i zobaczyć, czy naprawia (lub przynajmniej działa) twój problem.

+0

To działa, ale dlaczego wybiera tak duży domyślny rozmiar? –

+0

@Jason: nie mam pojęcia, ale podejrzewam, że wysyła zapytanie do danych systemowych, aby uzyskać rozmiar ekranu. Moja obecna aplikacja (moja pierwsza wersja WPF) zachowuje się podobnie, ponieważ centruje się i pozostawia trochę na krawędziach. Pamiętam, że przeczytałem gdzieś, że WPF domyślnie ustawiłoby 60% szerokości i wysokości głównego monitora, gdybyś go nie określił, ale także, że było wiele innych rzeczy, które również mogły na to wpływać (chociaż nie mogę znaleźć tego odniesienia teraz). Myślę, że po prostu pójdę z "SizeToContent" w przyszłości (zobacz moją aktualizację) i nie polegam na pewnej głupiej zgadywaniu przez MS :-) – paxdiablo

+0

I znalazłem link w końcu, co akurat sprawia, że ​​to pytanie jest nieudolne: http://stackoverflow.com/questions/1437099/window-size-when-sizetocontent-is-not-specified – paxdiablo

6

W projekcie widzisz małe, ponieważ masz mieszankę właściwości projektu dla okna.

d: DesignHeight = "296" d: DesignWidth = "634"

Ponieważ siatka jest dynamiczny układ będzie odcinek do szerokości okna & wysokość. Aby ograniczyć rozmiar okna, musisz podać Wysokość: & Właściwości szerokości do okna.

Powiązane problemy