WPF: कॉलम / पंक्ति मार्जिन / पेडिंग के साथ ग्रिड?


137

क्या WPF ग्रिड में पंक्तियों या स्तंभों के लिए मार्जिन और / या पैडिंग निर्दिष्ट करना आसानी से संभव है?

मैं निश्चित रूप से अंतरिक्ष चीजों में अतिरिक्त कॉलम जोड़ सकता हूं, लेकिन यह पैडिंग / मार्जिन के लिए एक नौकरी की तरह लगता है (यह बहुत सरल एक्सएएमएल देगा)। क्या किसी ने इस कार्यक्षमता को जोड़ने के लिए मानक ग्रिड से व्युत्पन्न किया है?


4
एक उपयोगी उदाहरण आप यहाँ पा सकते हैं: codeproject.com/Articles/107468/WPF-Padded-Grid
peter70

2
किंडा ने हैरान होकर कहा कि यह ग्रिड की आधारभूत विशेषताओं का हिस्सा नहीं है ...
uceumern

आज तक, 10 वर्षों के उत्तरों द्वारा प्रदर्शित किया गया, यह सच है कि यह आसानी से संभव नहीं है, और सबसे अच्छा किया जा सकता है (अतिरिक्त त्रुटि से बचने के लिए हर बार सेल का उपयोग किया जाता है) ग्रिड को प्राप्त करना है (जैसा कि पहले @ peter70 द्वारा सुझाया गया है) ) उपयुक्त सेल गद्दी निर्भरता संपत्ति जोड़ने के लिए जो सेल बच्चे के मार्जिन संपत्ति को नियंत्रित करेगा। यह एक लंबा काम नहीं है, और फिर आपको एक पुन: प्रयोज्य नियंत्रण मिला है। साइड कमेंट ... ग्रिड वास्तव में खराब तरीके से डिजाइन किया गया नियंत्रण है।
मिनट

जवाबों:


10

आप अपनी खुद की GridWithMarginकक्षा लिख सकते हैं , जो विरासत में मिली है Grid, और ArrangeOverrideमार्जिन को लागू करने की विधि को ओवरराइड कर सकती है


32
मुझे समझ में नहीं आता है कि लोग आपको अंगूठे क्यों देते हैं क्योंकि यह जितना आसान है उतना आसान है क्योंकि आप यहाँ सोचते / वर्णन करते हैं। बस इसे 30 मिनट करने की कोशिश करें और आप जल्दी से देखेंगे कि आपका जवाब अस्वीकार्य है। पंक्ति और स्तंभ फैले के बारे में भी सोचें
एरिक ओउलेट

89

RowDefinitionऔर ColumnDefinitionप्रकार के हैं ContentElement, और Marginकड़ाई से एक FrameworkElementसंपत्ति है। तो आपके प्रश्न के लिए, "क्या यह आसानी से संभव है" जवाब सबसे निश्चित नहीं है। और नहीं, मैंने ऐसा कोई लेआउट पैनल नहीं देखा है जो इस तरह की कार्यक्षमता प्रदर्शित करता हो।

आप सुझाए अनुसार अतिरिक्त पंक्तियों या स्तंभों को जोड़ सकते हैं। लेकिन आप Gridस्वयं किसी तत्व या किसी भी चीज़ पर मार्जिन सेट कर सकते हैं , जो कि अंदर जाएगा Grid, इसलिए अभी के लिए आपका सबसे अच्छा समाधान है।


ओपी राउडफिनिशन या कॉलमडिफाइनमेंट पर मार्जिन निर्धारित करने का प्रयास नहीं कर रहा है। वह ग्रिड के दृश्य बच्चों पर एक मार्जिन स्थापित करने का प्रयास कर रहा है, जो कि फ्रेमवर्क से प्राप्त होता है।
15ee8f99-57ff-4f92-890c-b56153

58

Borderसेल नियंत्रण के बाहर एक नियंत्रण का उपयोग करें और उसके लिए पैडिंग को परिभाषित करें:

    <Grid>
        <Grid.Resources >
            <Style TargetType="Border" >
                <Setter Property="Padding" Value="5,5,5,5" />
            </Style>
        </Grid.Resources>

        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <Border Grid.Row="0" Grid.Column="0">
            <YourGridControls/>
        </Border>
        <Border Grid.Row="1" Grid.Column="0">
            <YourGridControls/>
        </Border>

    </Grid>


स्रोत:


2
@RichardEverett वे बैक मशीन की जाँच करें: उत्तर में अद्यतन लिंक।
CJBS

मुझे यह उत्तर सबसे अच्छा लगा। यह मूल प्रश्न का समाधान प्रदान करता है और यह सीधे आगे है। धन्यवाद!
टोबियास

यह आसान और व्यावहारिक है
aggsol

19

आप कुछ इस तरह का उपयोग कर सकते हैं:

<Style TargetType="{x:Type DataGridCell}">
  <Setter Property="Padding" Value="4" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
          <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>

या यदि आपको टेम्प्लेटबिन्डिंग की आवश्यकता नहीं है:

<Style TargetType="{x:Type DataGridCell}">
   <Setter Property="Template">
      <Setter.Value>
          <ControlTemplate TargetType="{x:Type DataGridCell}">
              <Border Padding="4">
                  <ContentPresenter />
              </Border>
          </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>

28
धन्यवाद JayGee, हालांकि यह समाधान DataGrid के लिए है - मानक ग्रिड नियंत्रण नहीं।
ब्रैड लेच

पैडिंग स्पेस पर क्लिक करने से पंक्ति का चयन नहीं होता है।
jor

9

सोचा था कि मैं अपना समाधान जोड़ूंगा क्योंकि किसी ने अभी तक इसका उल्लेख नहीं किया है। ग्रिड पर आधारित UserControl डिजाइन करने के बजाय, आप एक शैली घोषणा के साथ ग्रिड में निहित नियंत्रणों को लक्षित कर सकते हैं। प्रत्येक के लिए परिभाषित किए बिना सभी तत्वों में पैडिंग / मार्जिन जोड़ने की देखभाल करता है, जो बोझिल और श्रम-गहन है। उदाहरण के लिए, यदि आपकी ग्रिड में टेक्स्टब्लॉक के अलावा कुछ नहीं है, तो आप यह कर सकते हैं:

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="Margin" Value="10"/>
</Style>

जो "सेल पैडिंग" के बराबर है।


क्या यह मुश्किल है? उदाहरण के लिए, यदि आपके पास ग्रिड पंक्ति में स्टैम्पपेल है, तो स्टैकपैन के टेक्स्टब्लॉक बच्चों को यह संपत्ति विरासत में मिलती है?
मास्लो

यकीन नहीं होता है कि यह पिछले बच्चों को धोखा देता है, लेकिन आप एक सरल परीक्षण के साथ पता लगा सकते हैं।
जेम्स एम

2
@ मास्लो जवाब बिल्कुल 'हां' है, लेकिन आपका शब्द थोड़ा भ्रामक है। कोई "इनहेरिट" की है Marginसंपत्ति पर जा रहा है, यह है कि किसी भी है Styleएक में ResourceDictionaryअपने के प्रत्येक तत्व के लिए लागू होगी TargetTypeहर जगह पूरे दायरे के भीतर है कि शब्दकोश के मालिक तत्व की। तो यह Styleवह चाल है, संपत्ति नहीं।
ग्लेन स्लेडेन

8

यह बहुत कठिन नहीं है। मैं यह नहीं कह सकता कि 2009 में जब सवाल पूछा गया था, तो यह कितना मुश्किल था, लेकिन यह तब था।

ध्यान दें कि यदि आप इस समाधान का उपयोग करते समय ग्रिड के किसी बच्चे पर स्पष्ट रूप से एक मार्जिन सेट करते हैं, तो वह मार्जिन डिजाइनर में दिखाई देगा, लेकिन रनटाइम के दौरान नहीं।

यह संपत्ति ग्रिड, StackPanel, WrapPanel, UniformGrid या पैनल के किसी भी अन्य वंशज पर लागू की जा सकती है। यह तत्काल बच्चों को प्रभावित करता है। यह माना जाता है कि बच्चे अपनी सामग्री के लेआउट का प्रबंधन करना चाहेंगे।

PanelExt.cs

public static class PanelExt
{
    public static Thickness? GetChildMargin(Panel obj)
    {
        return (Thickness?)obj.GetValue(ChildMarginProperty);
    }

    public static void SetChildMargin(Panel obj, Thickness? value)
    {
        obj.SetValue(ChildMarginProperty, value);
    }

    /// <summary>
    /// Apply a fixed margin to all direct children of the Panel, overriding all other margins.
    /// Panel descendants include Grid, StackPanel, WrapPanel, and UniformGrid
    /// </summary>
    public static readonly DependencyProperty ChildMarginProperty =
        DependencyProperty.RegisterAttached("ChildMargin", typeof(Thickness?), typeof(PanelExt),
            new PropertyMetadata(null, ChildMargin_PropertyChanged));

    private static void ChildMargin_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var target = d as Panel;

        target.Loaded += (s, e2) => ApplyChildMargin(target, (Thickness?)e.NewValue);

        ApplyChildMargin(target, (Thickness?)e.NewValue);
    }

    public static void ApplyChildMargin(Panel panel, Thickness? margin)
    {
        int count = VisualTreeHelper.GetChildrenCount(panel);

        object value = margin.HasValue ? margin.Value : DependencyProperty.UnsetValue;

        for (var i = 0; i < count; ++i)
        {
            var child = VisualTreeHelper.GetChild(panel, i) as FrameworkElement;

            if (child != null)
            {
                child.SetValue(FrameworkElement.MarginProperty, value);
            }
        }
    }
}

डेमो:

MainWindow.xaml

<Grid
    local:PanelExt.ChildMargin="2"
    x:Name="MainGrid"
    >
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Rectangle Width="100" Height="40" Fill="Red" Grid.Row="0" Grid.Column="0" />
    <Rectangle Width="100" Height="40" Fill="Green" Grid.Row="1" Grid.Column="0" />
    <Rectangle Width="100" Height="40" Fill="Blue" Grid.Row="1" Grid.Column="1" />

    <Button Grid.Row="2" Grid.Column="0" Click="NoMarginClick">No Margin</Button>
    <Button Grid.Row="2" Grid.Column="1" Click="BigMarginClick">Big Margin</Button>
    <ComboBox Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" />
</Grid>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void NoMarginClick(object sender, RoutedEventArgs e)
    {
        //  In real life, if we wanted to change PanelExt.ChildMargin at runtime, we 
        //  would prefer to bind it to something, probably a dependency property of 
        //  the view. But this will do for a demonstration. 
        PanelExt.SetChildMargin(MainGrid, null);
    }
    private void BigMarginClick(object sender, RoutedEventArgs e)
    {
        PanelExt.SetChildMargin(MainGrid, new Thickness(20));
    }
}

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


क्या आप जानते हैं कि आपका जवाब क्यों गलत है? ओपी की समस्या के समाधान के लिए एक काम की तरह लगता है
thesystem

4
@thesystem मुझे लगता है कि कोई व्यक्ति किसी बात को लेकर परेशान हो गया है। कोई बड़ी बात नहीं। लेकिन शायद इसमें एक बग है जो मुझे याद आया। होता है।
15ee8f99-57ff-4f92-890c-b56153

मिला dw 'कारण यह एक की आवश्यकता है buildया runइससे पहले कि लाइव पूर्वावलोकन प्रदर्शित किया जा सकता है? अच्छा और सरल। एक ऊपर।
मेव कैट 2012

3

मैं हाल ही में कुछ सॉफ़्टवेयर विकसित करते समय इस समस्या में भाग गया और यह मुझे पूछने के लिए क्यों कहा? उन्होंने ऐसा क्यों किया है ... जवाब मेरे सामने वहीं था। डेटा की एक पंक्ति एक वस्तु है, इसलिए यदि हम ऑब्जेक्ट ओरिएंटेशन बनाए रखते हैं, तो एक विशेष पंक्ति के लिए डिज़ाइन को अलग किया जाना चाहिए (मान लीजिए कि आपको भविष्य में बाद में पंक्ति प्रदर्शन फिर से उपयोग करने की आवश्यकता है)। इसलिए मैंने ज्यादातर डेटा डिस्प्ले के लिए डेटाबाउंड स्टैक पैनल और कस्टम नियंत्रण का उपयोग करना शुरू कर दिया। सूचियों ने कभी-कभार उपस्थिति दर्ज की है लेकिन ज्यादातर ग्रिड का उपयोग केवल प्राथमिक पेज संगठन (हेडर, मेनू क्षेत्र, सामग्री क्षेत्र, अन्य क्षेत्रों) के लिए किया गया है। आपके कस्टम ऑब्जेक्ट आसानी से स्टैक पैनल या ग्रिड के भीतर प्रत्येक पंक्ति के लिए किसी भी रिक्ति आवश्यकताओं को प्रबंधित कर सकते हैं (एक ग्रिड सेल में पूरी पंक्ति वस्तु हो सकती है। इसमें अभिविन्यास में परिवर्तन के लिए ठीक से प्रतिक्रिया करने का अतिरिक्त लाभ भी है।

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
  </Grid.RowDefinitions>

  <custom:MyRowObject Style="YourStyleHereOrGeneralSetter" Grid.Row="0" />
  <custom:MyRowObject Style="YourStyleHere" Grid.Row="1" />
</Grid>

या

<StackPanel>
  <custom:MyRowObject Style="YourStyleHere" Grid.Row="0" />
  <custom:MyRowObject Style="YourStyleHere" Grid.Row="1" />
</StackPanel>

यदि आपके डेटा बाइंडिंग का उपयोग कर रहे हैं तो आपके कस्टम नियंत्रणों को डेटोनेक्स्ट भी विरासत में मिलेगा ... इस दृष्टिकोण का मेरा व्यक्तिगत पसंदीदा लाभ।


आपने यहां जो करने का प्रयास ListViewकिया GridViewहै, वह मोड में WPF नियंत्रण का एक कच्चा संस्करण बनाता है, लेकिन सभी "रोओबजेक्ट्स" बनाने के लिए कोई प्रावधान नहीं है। वास्तव में, इसका ग्रिड से कोई लेना-देना नहीं है।
ग्लेन स्लेडेन


3

संपादित:

किसी भी नियंत्रण को मार्जिन देने के लिए आप इस तरह सीमा के साथ नियंत्रण को लपेट सकते हैं

<!--...-->
    <Border Padding="10">
            <AnyControl>
<!--...-->

ओपी समस्या ग्रिड के चारों ओर एक मार्जिन नहीं है, लेकिन ग्रिड कोशिकाओं के आसपास एक मार्जिन (या जैसा कि वास्तव में पंक्तियों और स्तंभों के आसपास पूछा गया है, बाद में " अतिरिक्त कॉलम / पंक्तियों को जोड़कर विरोधाभास किया गया है कि मैं टिप्पणी से बचने का प्रयास कर रहा था ") ।
मिनट

2

मैंने इसे अभी अपने एक ग्रिड के साथ किया था।

  • पहले ग्रिड के अंदर प्रत्येक तत्व के लिए समान मार्जिन लागू करें। आप शैलियों, या जो कुछ भी आप चाहते हैं, का उपयोग करके यह अमानवीय कर सकते हैं। मान लें कि आप 6px की क्षैतिज दूरी और 2px का एक ऊर्ध्वाधर अंतराल चाहते हैं। फिर आप ग्रिड के हर बच्चे के लिए "3px 1px" का मार्जिन जोड़ें।
  • फिर ग्रिड के चारों ओर बनाए गए मार्जिन को हटा दें (यदि आप ग्रिड के अंदर नियंत्रणों की सीमाओं को ग्रिड की उसी स्थिति में संरेखित करना चाहते हैं)। यह ग्रिड के लिए "-3px -1px" का एक मार्जिन सेट करें। इस तरह, ग्रिड के बाहर अन्य नियंत्रणों को ग्रिड के अंदर बाहरी नियंत्रणों के साथ संरेखित किया जाएगा।

ग्रिड के अंदर हर तत्व के लिए समान मार्जिन लागू करें यह सबसे आसान तरीका है।
Envil

1

एक संभावना यह होगी कि आप जिस पेड / मार्जिन की तलाश कर रहे हैं, उसके रूप में कार्य करने के लिए निश्चित चौड़ाई की पंक्तियों और स्तंभों को जोड़ा जाए।

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

एक अन्य विधि एकल पंक्ति और स्तंभ ग्रिड के साथ एक निश्चित आकार और मार्जिन वाले सभी ग्रिड तत्वों को लपेटने के लिए हो सकती है। आपके ग्रिड में निश्चित चौड़ाई / ऊंचाई के बक्से होते हैं जिनमें आपके वास्तविक तत्व होते हैं।


1
धन्यवाद एडम, हालांकि अतिरिक्त कॉलम / पंक्तियों को जोड़ना बिल्कुल वही है जो मैं बचने का प्रयास कर रहा था। मैं बस अपने मार्कअप को कम करना चाहता हूं और एक मार्जिन निर्दिष्ट करने में सक्षम होने या पैडिंग में इससे मदद मिलेगी।
ब्रैड लीच

आपको केवल अतिरिक्त कॉलम और पंक्तियों को परिभाषित करना है, उनके लिए मार्क को जोड़ना नहीं है। उदाहरण के लिए, यदि आप 3 कॉलम के कॉलम के बीच N चौड़ाई जोड़ना चाहते हैं, तो आपके पास 5 कॉलम परिभाषाएँ होंगी। पहले ऑटो की चौड़ाई होगी, और अगली तय, फिर ऑटो, फिर तय, फिर ऑटो। फिर केवल वास्तविक सामग्री तत्वों के लिए कॉलम 1, 3 और 5 असाइन करें। मैं अतिरिक्त कॉलम मार्कअप के बारे में आपकी बात देखता हूं, लेकिन जब तक आपको सैकड़ों तत्व नहीं मिल जाते, मुझे यह मामूली लगता है। हालांकि आपका फोन। इसके अलावा, क्या आपने मार्जिन सेट के साथ स्टैक पैनल के स्टैक पैनल का उपयोग करने की कोशिश की है?
एडम लेंडा

मेरे मामले में "स्प्लिटर / मार्जिन" कॉलम जोड़ना अब तक सबसे साफ और सबसे आसान था। धन्यवाद!
jchristof

1

मुझे हाल ही में दो कॉलम ग्रिड में ऐसी ही समस्या थी, मुझे केवल सही कॉलम में तत्वों पर मार्जिन की आवश्यकता थी। दोनों कॉलम के सभी तत्व टेक्स्टबलॉक प्रकार के थे।

<Grid.Resources>
    <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource OurLabelStyle}">
        <Style.Triggers>
            <Trigger Property="Grid.Column" Value="1">
                <Setter Property="Margin" Value="20,0" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Grid.Resources>

0

यद्यपि आप किसी ग्रिड में मार्जिन या पैडिंग नहीं जोड़ सकते हैं, आप फ़्रेम (या समान कंटेनर) जैसी किसी चीज़ का उपयोग कर सकते हैं, जिसे आप इसे लागू कर सकते हैं।

इस तरह (यदि आप बटन क्लिक पर नियंत्रण को दिखाते हैं या छिपाते हैं), तो आपको हर नियंत्रण पर मार्जिन जोड़ने की आवश्यकता नहीं होगी जो इसके साथ बातचीत कर सकते हैं।

इसे इकाइयों में नियंत्रण के समूहों को अलग करने के रूप में सोचें, फिर उन इकाइयों पर शैली लागू करें।


0

जैसा कि एक GridWithMargins वर्ग बनाने से पहले कहा गया था। यहाँ मेरा काम कोड उदाहरण है

public class GridWithMargins : Grid
{
    public Thickness RowMargin { get; set; } = new Thickness(10, 10, 10, 10);
    protected override Size ArrangeOverride(Size arrangeSize)
    {
        var basesize = base.ArrangeOverride(arrangeSize);

        foreach (UIElement child in InternalChildren)
        {
            var pos = GetPosition(child);
            pos.X += RowMargin.Left;
            pos.Y += RowMargin.Top;

            var actual = child.RenderSize;
            actual.Width -= (RowMargin.Left + RowMargin.Right);
            actual.Height -= (RowMargin.Top + RowMargin.Bottom);
            var rec = new Rect(pos, actual);
            child.Arrange(rec);
        }
        return arrangeSize;
    }

    private Point GetPosition(Visual element)
    {
        var posTransForm = element.TransformToAncestor(this);
        var areaTransForm = posTransForm.Transform(new Point(0, 0));
        return areaTransForm;
    }
}

उपयोग:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:GridWithMargins ShowGridLines="True">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Rectangle Fill="Red" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
            <Rectangle Fill="Green" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
            <Rectangle Fill="Blue" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        </local:GridWithMargins>
    </Grid>
</Window>

1
सिस्टम को फेंकता है। आक्रामकता: 'चौड़ाई गैर-नकारात्मक होनी चाहिए।' real.Width - = Math.Min (वास्तविक .id, RowMargin.Left + RowMargin.Right); वास्तविक। हाइट - = मैथ.इन (वास्तविक। हाइट, रोवरगिन। टॉप + रोवरजिन।बॉटम);
जेमी मेलवे जूल

जेमी के ठीक होने के साथ, यह चलता है, लेकिन फिर भी यह नहीं करता है कि इसे क्या करना चाहिए। ऑटो के लिए पंक्ति की ऊंचाई और स्तंभ की चौड़ाई के साथ, यह गलत तरीके से एक अलग तरीके से करता है।
15ee8f99-57ff-4f92-890c-b56153

0

मुझे आश्चर्य है कि मैंने इस समाधान को अभी तक पोस्ट नहीं किया है।

वेब से आकर, बूटस्ट्रैप जैसी रूपरेखाएं पंक्तियों / स्तंभों को खींचने के लिए एक नकारात्मक मार्जिन का उपयोग करेंगी।

यह थोड़ा वर्बोज़ हो सकता है (यद्यपि यह बुरा नहीं है), यह काम करता है और तत्व समान रूप से दूरी और आकार के होते हैं।

नीचे दिए गए उदाहरण में मैं एक StackPanelरूट का उपयोग करके दिखाता हूं कि 3 बटन समान रूप से हाशिये का उपयोग करके कैसे प्रदर्शित किए जाते हैं। आप अन्य तत्वों का उपयोग कर सकते हैं, बस आंतरिक x को बदलें: बटन से अपने तत्व तक टाइप करें।

विचार सरल है, आंतरिक ग्रिड की आधी राशि (नकारात्मक मार्जिन का उपयोग करके), उनकी सीमा से बाहर तत्वों के मार्जिन को खींचने के लिए बाहर की तरफ एक ग्रिड का उपयोग करें। आंतरिक ग्रिड का उपयोग उन तत्वों को समान रूप से करने के लिए करें जिन्हें आप चाहते हैं।

अपडेट: एक उपयोगकर्ता की कुछ टिप्पणी ने कहा कि यह काम नहीं करता है, यहां एक त्वरित वीडियो प्रदर्शित किया जा रहा है: https://youtu.be/rPx2OdtSOYI

यहां छवि विवरण दर्ज करें

    <StackPanel>
        <Grid>
            <Grid.Resources>
                <Style TargetType="{x:Type Grid}">
                    <Setter Property="Margin" Value="-5 0"/>
                </Style>
            </Grid.Resources>

            <Grid>
                <Grid.Resources>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="Margin" Value="10 0"/>
                    </Style>
                </Grid.Resources>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <Button Grid.Column="0" Content="Btn 1" />
                <Button Grid.Column="1" Content="Btn 2" />
                <Button Grid.Column="2" Content="Btn 3" />
            </Grid>

        </Grid>

        <TextBlock FontWeight="Bold" Margin="0 10">
            Test
        </TextBlock>
    </StackPanel>

1
मेरी गलती - मैं निहित बटन शैली पर ध्यान नहीं दिया। मैं नकारात्मक मार्जिन के बारे में थोड़ा सा विचलित था।
15ee8f99-57ff-4f92-890c-b56153

-6

कभी-कभी सरल विधि सबसे अच्छी होती है। बस रिक्त स्थान के साथ अपने तार पैड। यदि यह केवल कुछ टेक्स्टबॉक्स आदि है तो यह सबसे सरल विधि है।

आप बस एक निश्चित आकार के साथ रिक्त कॉलम / पंक्तियों को भी सम्मिलित कर सकते हैं। बेहद सरल और आप इसे आसानी से बदल सकते हैं।


शायद इसलिए कि यह बहुत अच्छी विधि नहीं है। रिक्त स्थान का उपयोग करना "आसान तरीका" हो सकता है, लेकिन यह वास्तव में हैक का अधिक है। यह सटीक नहीं है, यह (और शायद होगा) अलग स्केलिंग के साथ मॉनिटर पर अलग-अलग और अविश्वसनीय रूप से प्रस्तुत करता है और आपके द्वारा बनाई गई अंतरिक्ष की सटीक मात्रा पर आपका कोई नियंत्रण नहीं है। रिक्त कॉलम / पंक्तियों को सम्मिलित करने से आपकी ग्रिड गड़बड़ हो जाएगी ...
मार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.