2015-06-30 8 views
9

मैं विभिन्न UserControl गतिशील रूप से व्युत्पन्न प्रस्तुत करने के लिए ContentControl का उपयोग कर रहा हूं। जब मैं माता-पिता Window का आकार बदलता हूं तो मैं अपने जीवन के लिए नहीं समझ सकता कि सामग्री को कैसे खींचें। मुझे this जैसे कई संदर्भ मिले हैं, लेकिन यह अभी भी मेरे लिए काम नहीं कर रहा है। और साथ हीविस्तार करने के लिए WPF ContentControl सामग्री कैसे प्राप्त करें?

<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> 

यहां मुख्य Window के लिए पीछे कोड है:

<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> 

इस संसाधन फ़ाइल Dictionary1.XAML उपयोग करता है:

यह Window XAML है: यहाँ एक सरल उदाहरण है मॉडल कक्षाएं देखें:

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 
{ 

} 

और अंत उपयोगकर्ता नियंत्रण:

<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> 

यहाँ क्या यह रन टाइम पर की तरह लग रहा है:

enter image description here enter image description here

मैं यहाँ क्या याद आ रही है? मैं बच्चे की सामग्री को इस तरह व्यवहार करने के लिए कैसे प्राप्त कर सकता हूं कि यह माता-पिता के शीर्ष/बाएं और पैरेंट का आकार बदलने के रूप में नीचे/दाएं हिस्सों तक लगी हुई है?

+0

यह शीर्ष/बाईं ओर लंगर डाले रहने नहीं करता है अगर आप ContentControl पर ऊर्ध्वाधर और क्षैतिज संरेखण 'Stretch' का उपयोग करें? – Domysee

+0

@ डोमिनिक - यह नहीं है। यह शीर्ष/बाईं ओर लंगर के बजाय केंद्रित रहता है। –

उत्तर

11

दो बातें दूर करने के लिए है:

पहले, आप अपने ContentControl पर VerticalAlignment और HorizontalAlignment निकालना चाहते हैं। इन्हें सेट करने से सामग्री नियंत्रण को उसके कंटेनर में खींचने से रोका जा सकता है, इसलिए Width और Height सम्मानित हैं, जो डिफ़ॉल्ट रूप से शून्य दोनों हैं (इसलिए कंटेनर का आकार कोई नहीं है)।

VerticalAlignment और HorizontalAlignment से Stretch सेट करना, या डिफ़ॉल्ट होने के बाद इसे छोड़ना, कंटेनर को ग्रिड भर देगा, जो आप चाहते हैं।

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

दूसरा, UserControl भीतर Width और Height की स्थापना, कि निश्चित आकार करने के लिए अपने आकार सेट तो यह स्वयं ही समायोजित नहीं करेगा। उन विशेषताओं को हटाएं और उपयोगकर्ता नियंत्रण भी सामग्री को भरने के लिए, इसे फैलाने के लिए डिफ़ॉल्ट होगा।

यदि आप डिज़ाइन उद्देश्यों के लिए एक निश्चित आकार चाहते हैं, तो वास्तविक नियंत्रण आकार के बजाय डिज़ाइन आकार सेट करें।इसके लिए, आपके पास d XAML नेमस्पेस है जिसमें DesignWidth और DesignHeight गुण शामिल हैं। इन्हें स्थापित करने से डिजाइनर को प्रभावित होगा लेकिन जब दृश्य प्रस्तुत किया जाता है तो उन्हें बाद में अनदेखा कर दिया जाता है।

<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

आप Height और Width उपयोगकर्ता नियंत्रण की संपत्ति सेट करते हैं। यह डब्ल्यूपीएफ लेआउटिंग के किसी भी छूट को हटा देता है। तो यह सबसे अच्छी चीज है जो यह कर सकता है, जो UserControl को केंद्रित कर रहा है। यदि आप चौड़ाई और ऊंचाई को हटाते हैं, तो आपको उम्मीद के अनुसार खिंचाव करना चाहिए।

<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> 

के रूप में कृपया मुझे याद दिलाया प्रहार, आप भी VerticalAlignment="Top" और HorizontalAlignment="Left"

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

वह अकेला मदद नहीं करेगा, क्योंकि सामग्री नियंत्रण में कोई आकार नहीं है। – poke

+0

ओह ठीक है, संकेत के लिए धन्यवाद! – Domysee

संबंधित मुद्दे