2011-01-06 15 views
7

Próbuję ustawić MinHeight/MinWidth okna o zmiennej wielkości na podstawie jego początkowej wysokości (gdy SizeToContent = "WidthAndHeight").WPF - Próba ustawienia MinHeight okna o zmiennej wielkości na podstawie jego początkowej wysokości

Widziałem kilka odpowiedzi/rozwiązania:

http://weblogs.asp.net/psheriff/archive/2010/01.aspx

Set form MinWidth and MinHeight based on child property

Jednakże:

  1. Próbuję użyć deseniu MVVM i chciałby być w stanie osiągnąć to w xaml.

  2. chciałbym również, aby zachować wartości takie jak MinHeight z ViewModel - nie sądzę, że należą tam jak oni związać trywialne część zachowanie celu viewmodel. To jest coś, co chciałbym pozostawić projektantowi UX.

Rozwiązanie walczę o to, aby wykorzystać następujące XAML/oprawa:

<Window 
     .... 
     x:Name="mainWindow" 
     SizeToContent="WidthAndHeight" 
     ResizeMode="CanResizeWithGrip" 
     MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}" 
> 

Mam nadzieję, że „Mode = onet” wiązałby się MinHeight do wartości początkowej wysokości okien .

Ale to nie działa.

Czy ktoś może wyjaśnić, dlaczego? Czy istnieje rozwiązanie, które spełnia moje kryteria?

Dzięki,

Oznacz

Odpowiedz

8

Kod:

<Window 
     .... 
     x:Name="mainWindow" 
     SizeToContent="WidthAndHeight" 
     ResizeMode="CanResizeWithGrip" 
     MinHeight="{Binding ElementName=mainWindow, Mode=OneTime, Path=ActualHeight}" 
> 

To nie będzie działać, ponieważ wartość domyślna ActualHeight wynosi zero, a do czasu WPF framework zmienia rozmiar okna, to już przypisano MinHeight z domyślną wartością ActualHeight, która wynosi zero!

Pierwszą rzeczą, można spróbować to: zmiana Mode=OneTime do Mode=Default tak, że WPF mógł zaktualizować MinHeight gdy ActualHeight zostaje zmieniona na zmianę rozmiaru okna. Jeśli to zadziała, będziesz szczęśliwy.

W przeciwnym razie należy obsłużyć zdarzenie SizeChanged, aw programie obsługi można zaktualizować MinHeight.

<Window 
      .... 
      x:Name="mainWindow" 
      SizeToContent="WidthAndHeight" 
      ResizeMode="CanResizeWithGrip" 
      SizeChanged="Window_SizeChanged" 
> 

W opóźnieniem kodu:

bool firstTime= true; 
private void Window_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    FrameworkElement element = sender as FrameworkElement; 
    if (firstTime) 
    { 
      element.MinHeight = e.NewSize.Height; 
      firstTime= false; 
    } 
} 

nadzieję, że to rozwiąże problem. Lub conajmniej da ci jakiś pomysł, jak postępować. Jeśli chcesz naprawić rozmiar swojego okna, możesz również ustawić MaxHeight w procedurze obsługi Window_SizeChanged().


XAML jedynym rozwiązaniem

<Window 
     x:Name="mainWindow" 
     SizeToContent="WidthAndHeight" 
     ResizeMode="CanResizeWithGrip" 
> 
<Window.Triggers> 
<EventTrigger RoutedEvent="SizeChanged"> 
    <BeginStoryboard> 
     <Storyboard Storyboard.TargetName="mainWindow"> 
      <DoubleAnimation Storyboard.TargetProperty="MinHeight" 
          To="{Binding ElementName=mainWindow, Path=ActualHeight}"/> 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 
</Window.Triggers> 
<!---- other code goes here---> 
</Window> 
+1

Spowoduje to ustawienie MinHeight na niezerową wartość. Jednak zawsze ustawia MinHeight za każdym razem, gdy zmienia się rozmiar okna, co oznacza, że ​​użytkownik może zwiększyć rozmiar okna, ale nigdy go nie zmniejszyć. Próbuję ustawić MinHeight tylko raz - do jego początkowego rozmiaru określonego przez "SizeToContent =" WidthAndHeight "' –

+0

Być może istnieje sposób odroczenia wiązania, dopóki okno nie zostanie po raz pierwszy zmienione. Czy mogę to zrobić w xaml? –

+0

@ Mark: Powinieneś obsłużyć wydarzenie SizeChanged :-) – Nawaz

0

Podejrzewam szukasz tego kawałka kodu:

<Window 
x:Name="myWindow" 
MinHeight="266" Height="{Binding ElementName=myWindow, Path=MinHeight}" 
MinWidth="480" Width="{Binding ElementName=myWindow, Path=MinWidth}"> 

Ustawia wysokość i szerokość do zestawu MinHeight i MinWidth. Masz tylko jedną pozycję do zmiany.

Powiązane problemy