2015-06-30 10 views
9

Używam ContentControl do dynamicznego renderowania różnych pochodnych UserControl. Nie mogę do końca życia dowiedzieć się, jak rozciągnąć zawartość, gdy zmieniam rozmiar rodzica Window. Znalazłem wiele odniesień, takich jak this, ale nadal nie działa dla mnie. Oto prosty przykład:Jak uzyskać dostęp do zawartości WPF ContentControl?

To Window XAML:

<Window x:Class="WpfApplication3.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary Source="Dictionary1.xaml"/> 
    </Window.Resources> 
    <Grid> 
     <ContentControl VerticalAlignment="Top" 
         HorizontalAlignment="Left" 
         VerticalContentAlignment="Stretch" 
         HorizontalContentAlignment="Stretch" 
         Content="{Binding Path=ChildView}" 
         Margin="10"/> 
    </Grid> 
</Window> 

ta wykorzystuje plik zasobów Dictionary1.XAML:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:viewModels ="clr-namespace:WpfApplication3" 
        xmlns:views ="clr-namespace:WpfApplication3"> 

    <DataTemplate DataType="{x:Type viewModels:UserControlViewModel}"> 
     <views:UserControl1/> 
    </DataTemplate> 
</ResourceDictionary> 

Oto kod tyłu za głównym Window jak również zobacz klasy modeli:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new MainViewModel(); 
    } 
}  

public class MainViewModel 
{ 
    public UserControlViewModel ChildView { get; set; } 

    public MainViewModel() 
    { 
     ChildView = new UserControlViewModel(); 
    } 
} 

public class UserControlViewModel 
{ 

} 

i wreszcie kontrola użytkownika:

<UserControl x:Class="WpfApplication3.UserControl1" 
      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" 
      mc:Ignorable="d" 
      Background="Blue" 
      Height="141" Width="278" 
      VerticalAlignment="Stretch" 
      HorizontalAlignment="Stretch"> 
    <Grid> 

    </Grid> 
</UserControl> 

Oto jak to wygląda w czasie wykonywania:

enter image description here enter image description here

Co ja tu brakuje? Jak mogę sprawić, aby treść podrzędna zachowywała się tak, aby pozostała zakotwiczona w górnej/lewej części elementu nadrzędnego, a dolna/prawa rozciąga się w miarę zmiany rozmiaru elementu nadrzędnego?

+0

w jaki sposób nie pozostaje on zakotwiczony w górnej/lewej części, jeśli używasz wyrównania pionowego i poziomego 'Stretch' na treści? – Domysee

+0

@Dominik - Nie ma. Pozostaje wyśrodkowany zamiast zakotwiczony do góry/z lewej. –

Odpowiedz

11

dwie rzeczy:

pierwsze, chcesz usunąć VerticalAlignment i HorizontalAlignment na ContentControl. Ustawienie tych elementów zapobiegnie rozciąganiu kontroli treści w jej kontenerze, więc są one przestrzegane, które są domyślnie zerowe (więc pojemnik nie ma własnego rozmiaru). Ustawienie

Ustawienie VerticalAlignment i HorizontalAlignment na Stretch, lub pominięcie go, ponieważ jest to ustawienie domyślne, spowoduje, że kontener wypełni siatkę, co jest potrzebne.

<ContentControl Content="{Binding Path=ChildView}" Margin="10" /> 

drugie ustawienie Width i Height w UserControl ustawi swój rozmiar tej stałej wielkości, więc nie dostosuje się. Usuń te atrybuty, a kontrola użytkownika będzie domyślnie rozciągać się, co spowoduje wypełnienie kontroli treści.

Jeśli chcesz mieć określony rozmiar do celów projektowych, ustaw rozmiar projektu o rozmiarze zamiast rzeczywistego rozmiaru kontrolnego.W tym celu masz przestrzeń nazw XAML d, która zawiera właściwości DesignWidth i DesignHeight. Ustawienie tych parametrów wpłynie na projektanta, ale zostaną one zignorowane później, gdy widok zostanie wyrenderowany.

<UserControl x:Class="WpfApplication3.UserControl1" 
     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" mc:Ignorable="d" 
     d:DesignWidth="400" d:DesignHeight="250" 
     Background="Blue"> 
    … 
</UserControl> 
6

Użytkownik ustawia właściwość Height i Width UserControl. W ten sposób wyeliminowana jest dowolność układu WPF. Czyni to najlepiej, co może, co stanowi centralizację UserControl. Jeśli usuniesz szerokość i wysokość, powinna ona rozciągać się zgodnie z oczekiwaniami.

<UserControl x:Class="WpfApplication3.UserControl1" 
     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" 
     mc:Ignorable="d" 
     Background="Blue" 
     Height="141" Width="278" //<-- remove 
     VerticalAlignment="Stretch" 
     HorizontalAlignment="Stretch"> 
<Grid> 

</Grid> 
</UserControl> 

Jak Poke uprzejmie przypomniał mi, trzeba także usunąć VerticalAlignment="Top" i HorizontalAlignment="Left"

<ContentControl VerticalAlignment="Top" //<--remove 
        HorizontalAlignment="Left" //<--remove 
        VerticalContentAlignment="Stretch" 
        HorizontalContentAlignment="Stretch" 
        Content="{Binding Path=ChildView}" 
        Margin="10"/> 
+1

Samo w sobie nie pomoże, ponieważ sama kontrola treści nie ma rozmiaru. – poke

+0

o rację, dzięki za podpowiedź! – Domysee

Powiązane problemy