2012-09-03 5 views
9

Ich möchte, dass das Fenster MinWidth/MinHeight und MaxWidth/MaxHeight Spezifikationen der Inhaltskontrolle innerhalb entspricht.Fenster Größenbeschränkungen nach Inhalt

Einige haben vorgeschlagen, SizeToContent zu verwenden, aber das hilft nur beim Festlegen der anfänglichen Fenstergröße, nicht der Einschränkungen.

Andere schlagen vor, MeasureOverride zu überschreiben und Fenster Min/Max Höhe und Breite dort zu setzen, aber das scheint etwas unrein zu sein, wenn man bedenkt, dass solch ein triviales Problem sicherlich eine rein deklarative Lösung haben sollte.

einfach eine andere Lösung zu erwähnen, die aber nicht Arbeit (und war zuvor in einer Antwort erwähnt, die gelöscht wurde) sinnvoll erscheint: Bindung MinWidth des Fensters MinWidth der Kontrolle übernehmen nicht berücksichtigt Fensterdekorationen.

Antwort

7

Wenn die anfängliche Fenstergröße so festgelegt ist, dass die tatsächliche Inhaltsgröße nicht durch die MinWidth/MinHeight und MaxWidth/MaxHeight des Inhalts im anfänglichen Layoutdurchlauf (z. B. durch Verwendung von Window.SizeToContent = "WidthAndHeight") erzwungen wird folgende Gleichungen erfüllt sind:

Window.ActualSize - Content.ActualSize = 
     Window.MinSize - Content.MinSize = Window.MaxSize - Content.MaxSize. 

Basierend auf diesen Gleichungen können Sie den folgenden Code ableiten:

public MainWindow() 
{ 
    InitializeComponent(); 

    this.SizeChanged += OnWindowSizeChanged; 
} 

private static void OnWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    var window = (Window)sender; 
    var content = (FrameworkElement)window.Content; 

    window.MinWidth = window.ActualWidth - content.ActualWidth + content.MinWidth; 
    window.MaxWidth = window.ActualWidth - content.ActualWidth + content.MaxWidth; 

    window.MinHeight = window.ActualHeight - content.ActualHeight + content.MinHeight; 
    window.MaxHeight = window.ActualHeight - content.ActualHeight + content.MaxHeight; 

    window.SizeChanged -= OnWindowSizeChanged; 
} 

ich weiß nicht, wie dies zu erreichen effizient den reinen deklarativen Ansatz, da sollte der Code ran nur einmal nach dem ini Tial Layout übergeben.

+0

Wissen Sie, ob SizeChanged ausgelöst wird, wenn sich MinWidth/MinHeight oder MaxWidth/MaxHeight des Inhalts ändern? Oder sollte ich diesen Eigenschaften eine Bindung separat hinzufügen? – EFraim

+0

Das ist definitiv nützlich, ich überprüfe gerade, ob es mein Problem vollständig löst. – EFraim

1

Verwenden Sie Binding Markup-Erweiterung. Eine Bindung ist die Art, wie wpf sagt, wenn sich diese Eigenschaft (Quelle) ändert, eine andere Eigenschaft (Ziel) aktualisieren. In diesem Fall ist die MinWidth-Eigenschaft des Rasters die Quelle und die MinWidth-Eigenschaft des Fensters ist das Ziel.

<Window x:Class="MinMaxValuesOnWindows.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="600" Width="800" 
    MinWidth="{Binding ElementName=gridy, Path=MinWidth}" 
    MinHeight="{Binding ElementName=gridy, Path=MinHeight}" 
    MaxWidth="{Binding ElementName=gridy, Path=MaxWidth}" 
    MaxHeight="{Binding ElementName=gridy, Path=MaxHeight}"> 
    <Grid Name="gridy" MinHeight="80" MinWidth="80" MaxHeight="300" MaxWidth="300"/> 
</Window> 

Wie Sie im Thema erwähnte dies nicht vollständig funktioniert, aber Sie können einen Konverter auf der Bindung verwenden, auf dem Fensterrahmen in der Höhe und Breite hinzufügen, bevor das verbindliche Ziel der Aktualisierung (möglicherweise eine PInvoke erforderlich). Da ich bezweifle, dass sich die Fensterrahmenstärke in Ihrer Anwendung dynamisch ändert, kann dies wahrscheinlich nur ein konstanter Wert sein (nicht notwendigerweise, wenn der Benutzer die Designs ändert).

+0

Was Sie sagen, ist technisch wahr, aber wie ich in der Frage bemerkt habe, besteht die Hauptschwierigkeit darin, die Dekorationsdimensionen themenunabhängig herauszufinden. Die andere Antwort löst diesen Teil des Puzzles, deshalb werde ich es akzeptieren. – EFraim

5

Einige haben vorgeschlagen, SizeToContent zu verwenden, aber das hilft nur beim Festlegen der anfänglichen Fenstergröße, nicht der Einschränkungen.

ich um dieses arbeitete durch die MinWidth und MinHeight Eigenschaften festlegen direkt nach die Fenster initialisiert wurde:

MainWindow.xaml

<Window ... SizeToContent="WidthAndHeight"> 
    ... 
</Window> 

MainWindow.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
    SourceInitialized += (s, e) => 
    { 
     MinWidth = ActualWidth; 
     MinHeight = ActualHeight; 
    }; 
} 
+0

Dies sollte die akzeptierte Antwort sein. – user2481095

Verwandte Themen