ডব্লিউপিএফ: কলাম / সারি মার্জিন / প্যাডিং সহ গ্রিড?


137

ডাব্লুপিএফ গ্রিডে সারি বা কলামগুলির জন্য কোনও মার্জিন এবং / অথবা প্যাডিং নির্দিষ্ট করা কি সহজেই সম্ভব?

আমি অবশ্যই স্পেস জিনিসের বাইরে অতিরিক্ত কলাম যুক্ত করতে পারতাম, তবে এটি প্যাডিং / মার্জিনের চাকরীর মতো বলে মনে হচ্ছে (এটি আরও সহজ এক্সএএমএল দেবে)। এই কার্যকারিতা যুক্ত করতে কেউ কি স্ট্যান্ডার্ড গ্রিড থেকে উদ্ভূত হয়েছে?


4
একটি দরকারী উদাহরণ আপনি এখানে পেতে পারেন: কোডেপ্রজেক্ট
আর্টিকেলস

2
কিন্ডা আশ্চর্য হয়ে বললেন যে এটি গ্রিডের বেসলাইন বৈশিষ্ট্যের অংশ নয় ...
uceumern

আজ হিসাবে, 10 বছরের উত্তর দ্বারা প্রদর্শিত হয়েছে, সত্য এটি সহজেই সম্ভব নয় এবং সম্পন্ন করা ভাল (প্রতিটি বার কোনও সেল ব্যবহৃত হওয়ার সাথে সাথে অতিরিক্ত ত্রুটির প্রবণ কাজ এড়াতে) গ্রিডটি অর্জন করা হয় (@ পিটার 70 এর আগে যেমন প্রস্তাবিত হয়েছিল) ) উপযুক্ত সেল প্যাডিং নির্ভরতা সম্পত্তি যুক্ত করতে যা ঘরের সন্তানের মার্জিন সম্পত্তি নিয়ন্ত্রণ করবে। এটি কোনও দীর্ঘস্থায়ী কাজ নয় এবং তারপরে আপনি পুনরায় ব্যবহারযোগ্য নিয়ন্ত্রণ পেয়েছেন। পার্শ্ব মন্তব্য ... গ্রিড সত্যিই খুব খারাপভাবে ডিজাইন করা একটি নিয়ন্ত্রণ।
মিনিট

উত্তর:


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
@ রিচার্ডএভারেট ওয়ে ব্যাক মেশিনটি পরীক্ষা করুন: উত্তরে লিংক আপডেট হয়েছে।
সিজেবিএস

আমার এই উত্তরটি সবচেয়ে ভাল লেগেছে। এটি মূল প্রশ্নের সমাধান সরবরাহ করে এবং এটি সরাসরি এগিয়ে। ধন্যবাদ!
টোবিয়াস

এটি সহজ এবং ব্যবহারিক
অ্যাগজল

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
ধন্যবাদ জেগি, তবে এই সমাধানটি ডেটাগ্রিডের জন্য - মানক গ্রিড নিয়ন্ত্রণ নয়।
ব্র্যাড লিচ

প্যাডিং স্পেসে ক্লিক করা আর সারিটি নির্বাচন করে না।
জোর

9

ভেবেছিলাম আমি আমার নিজের সমাধান যুক্ত করব কারণ এখনও কেউ এটি উল্লেখ করেনি। গ্রিডের উপর ভিত্তি করে ইউজারকন্ট্রোল ডিজাইনের পরিবর্তে, আপনি গ্রিডে থাকা নিয়ন্ত্রণগুলি একটি শৈলীর ঘোষণার সাথে লক্ষ্যবস্তু করতে পারেন। প্রত্যেকের জন্য সংজ্ঞা না দিয়ে সমস্ত উপাদানগুলিতে প্যাডিং / মার্জিন যুক্ত করার যত্ন নেয় যা জটিল এবং শ্রমনির্ভর instance উদাহরণস্বরূপ, যদি আপনার গ্রিডে টেক্সটব্লকগুলি ছাড়া আর কিছু না থাকে তবে আপনি এটি করতে পারেন:

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

যা "সেল প্যাডিং" এর সমতুল্য।


এই কৃপণতা নিচে না? উদাহরণস্বরূপ, যদি আপনার গ্রিড সারিতে স্ট্যাকপ্যানেল থাকে তবে স্ট্যাকপ্যানেলের পাঠ্য ব্লক শিশুরা কি এই সম্পত্তিটির উত্তরাধিকারী?
মাসলো

এটি অতীতের তাত্ক্ষণিক শিশুদের চালিত করে কিনা তা নিশ্চিত নয় তবে আপনি একটি সাধারণ পরীক্ষা দিয়ে এটি জানতে পারেন।
জেমস এম

2
@ মাসলো উত্তরটি একেবারে 'হ্যাঁ', তবে আপনার শব্দটি কিছুটা বিভ্রান্তিকর। Marginসম্পত্তিটির কোনও "উত্তরাধিকারসূত্রে" চলছে না, এটি হ'ল অভিধানের মালিকের উপাদানটির পুরো ক্ষেত্রের Styleমধ্যে যে কোনও জায়গায় ResourceDictionaryতার প্রতিটি উপাদানকে প্রয়োগ করা হবে । সুতরাং সম্পত্তিটি নয়, এটি কৌশলগুলি। TargetTypeStyle
গ্লেন স্লেডেন

8

এটি মারাত্মকভাবে কঠিন নয়। 2009 সালে যখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল তখন এটি কতটা কঠিন হয়েছিল তা আমি বলতে পারি না, তবে তখন ছিল।

নোট করুন যে আপনি যদি এই সমাধানটি ব্যবহার করার সময় গ্রিডের কোনও শিশুকে স্পষ্টভাবে একটি মার্জিন সেট করেন, তবে সেই মার্জিনটি ডিজাইনারে উপস্থিত হবে তবে রানটাইমে নয় not

এই সম্পত্তিটি গ্রিড, স্ট্যাকপ্যানেল, র‌্যাপপ্যানেল, ইউনিফর্মগ্রিড বা প্যানেলের অন্য কোনও বংশধরকে প্রয়োগ করা যেতে পারে। এটি তাত্ক্ষণিক শিশুদের প্রভাবিত করে। ধারণা করা হয় যে বাচ্চারা তাদের নিজস্ব সামগ্রীর বিন্যাস পরিচালনা করতে চাইবে।

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));
    }
}

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


আপনি জানেন কেন আপনার উত্তরটি নিম্নচাপযুক্ত?
ওপির

4
@ থিটি সিস্টেমটি আমি মনে করি যে কেউ কোনও কিছুর বিষয়ে মন খারাপ করেছে। তেমন কিছু না. তবে সম্ভবত এটিতে একটি বাগ আছে যা আমি মিস করেছি। এটা হয়।
15ee8f99-57ff-4f92-890c-b56153

ডিডব্লিউ 'কারণ পেয়েছে এটির জন্য buildবা runলাইভ পূর্বরূপ প্রদর্শিত হতে পারে তার আগে? ভাল এবং সহজ এক। 1 উপরে.
মেও বিড়াল 2012

3

সম্প্রতি কিছু সফ্টওয়্যার বিকাশ করার সময় আমি এই সমস্যায় পড়েছিলাম এবং আমার কাছে কেন জিজ্ঞাসা করা হয়েছে? কেন তারা এটি করেছে ... উত্তরটি আমার সামনে ঠিক সেখানে ছিল। ডাটাগুলির একটি সারি একটি বস্তু, সুতরাং আমরা যদি অবজেক্ট অরিয়েন্টেশনটি বজায় রাখি তবে একটি নির্দিষ্ট সারিটির জন্য নকশাটি আলাদা করা উচিত (মনে করুন ভবিষ্যতে আপনার সারি প্রদর্শনটি পুনরায় ব্যবহার করতে হবে)। তাই আমি বেশিরভাগ ডেটা প্রদর্শনের জন্য ডেটাবাউন্ড স্ট্যাক প্যানেল এবং কাস্টম নিয়ন্ত্রণগুলি ব্যবহার শুরু করি। তালিকাগুলি মাঝে মধ্যে উপস্থিত হয়ে উঠেছে তবে বেশিরভাগ গ্রিডটি কেবলমাত্র প্রাথমিক পৃষ্ঠার সংস্থার জন্য ব্যবহৃত হয়েছে (শিরোনাম, মেনু অঞ্চল, সামগ্রী বিষয়বস্তু, অন্যান্য অঞ্চল)। আপনার কাস্টম অবজেক্টগুলি স্ট্যাক প্যানেল বা গ্রিডের মধ্যে প্রতিটি সারির জন্য যে কোনও ফাঁকির প্রয়োজনীয়তাগুলি সহজেই পরিচালনা করতে পারে (একক গ্রিড কক্ষে পুরো সারির বস্তু থাকতে পারে or এটির দিকনির্দেশের পরিবর্তনে সঠিকভাবে প্রতিক্রিয়া করার অতিরিক্ত সুবিধাও রয়েছে,

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

আপনার কাস্টম নিয়ন্ত্রণগুলি যদি ডেটা বন্ডিং ব্যবহার করে ... তবে এই পদ্ধতির আমার ব্যক্তিগত প্রিয় সুবিধা Data


আপনি এখানে যা করার চেষ্টা করেছেন তা হ'ল মোডে ডাব্লুপিএফ ListViewনিয়ন্ত্রণের একটি অশোধিত সংস্করণ তৈরি করা GridView, তবে সমস্ত "RowObjects" একই কলামের প্রস্থকে ভাগ করে নেওয়ার কোনও বিধান ছাড়াই। বাস্তবে, গ্রিডের সাথে এর আর বেশি কিছু করার নেই।
গ্লেন স্লেডেন


3

সম্পাদিত:

যে কোনও নিয়ন্ত্রণের মার্জিন দিতে আপনি এই জাতীয় সীমানা দিয়ে নিয়ন্ত্রণটি মোড়ানো করতে পারেন

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

ওপি সমস্যাটি গ্রিডের চারপাশে মার্জিন না হওয়ার জন্য নয়, তবে গ্রিড কোষের চারপাশে একটি মার্জিন (বা প্রকৃতপক্ষে সারি এবং কলামগুলির বিষয়ে জিজ্ঞাসা করা হয়েছে, পরে " অতিরিক্ত কলাম / সারি যুক্ত করে বিরোধিতা করা হয়েছে " মন্তব্যটি এড়াতে আমি ঠিক তাই চেষ্টা করেছি )) ।
মিনিট

2

আমি এখনই আমার গ্রিডগুলির একটি দিয়ে এটি করেছি।

  • প্রথমে গ্রিডের প্রতিটি উপাদানগুলিতে একই মার্জিনটি প্রয়োগ করুন। আপনি শৈলী ব্যবহার করে বা আপনার পছন্দ মতো যা কিছু করতে পারেন তা করতে পারেন। বলুন আপনি 6px এর অনুভূমিক ব্যবধান এবং 2px এর উল্লম্ব ব্যবধান চান। তারপরে আপনি গ্রিডের প্রতিটি সন্তানের সাথে "3px 1px" এর মার্জিন যুক্ত করুন।
  • তারপরে গ্রিডের চারপাশে তৈরি মার্জিনগুলি সরান (আপনি গ্রিডের মধ্যে নিয়ন্ত্রণের সীমানাগুলিকে গ্রিডের একই অবস্থানে সারিবদ্ধ করতে চান)। এই গ্রিডে "-3px -1px" এর মার্জিনটি সেট করুন। এইভাবে, গ্রিডের বাইরের অন্যান্য নিয়ন্ত্রণগুলি গ্রিডের অভ্যন্তরীণতম নিয়ন্ত্রণগুলির সাথে একত্রিত হবে।

গ্রিডের প্রতিটি উপাদানগুলিতে একই মার্জিনটি প্রয়োগ করা সহজতম উপায় বলে মনে হয়।
এনভিল

1

আপনার সম্ভাব্য প্যাডিং / মার্জিন হিসাবে কাজ করার জন্য একটি সম্ভাব্য স্থির প্রস্থের সারি এবং কলামগুলি যুক্ত করা হবে।

আপনি এটিও বিবেচনা করতে পারেন যে আপনি আপনার ধারক আকারের দ্বারা সীমাবদ্ধ, এবং গ্রিডটি উপাদানযুক্ত উপাদান বা তার নির্দিষ্ট প্রস্থ এবং উচ্চতার মতো বৃহত্তর হয়ে উঠবে। আপনি কেবল প্রস্থ বা উচ্চতা সেট ছাড়া কলাম এবং সারি ব্যবহার করতে পারেন। এইভাবে তারা গ্রিডের মধ্যে মোট স্থান সমানভাবে ভেঙে ডিফল্ট করে। তারপরে এটি কেবল আপনার গ্রিডের মধ্যে আপনার উপাদানগুলিকে উল্লম্বভাবে এবং অনুভূমিকভাবে কেন্দ্র করে দেবে a

অন্য পদ্ধতিটি হ'ল একক সারি এবং কলাম গ্রিডের একটি নির্দিষ্ট আকার এবং মার্জিনযুক্ত একটি স্থানে সমস্ত গ্রিড উপাদানগুলি মোড়ানো। আপনার গ্রিডে স্থির প্রস্থ / উচ্চতার বাক্স রয়েছে যাতে আপনার আসল উপাদান রয়েছে।


1
ধন্যবাদ আদম, তবে অতিরিক্ত কলাম / সারি যুক্ত করা ঠিক আমি এড়াতে চাইছিলাম। আমি কেবল আমার মার্কআপটি হ্রাস করতে চাই এবং একটি মার্জিন বা প্যাডিং নির্দিষ্ট করতে সক্ষম হওয়া এতে সহায়তা করবে।
ব্র্যাড লিচ

আপনাকে কেবল অতিরিক্ত কলাম এবং সারিগুলি সংজ্ঞায়িত করতে হবে, তাদের জন্য চিহ্নটি যুক্ত করবেন না। উদাহরণস্বরূপ, যদি আপনি 3 কলামের জন্য কলামগুলির মধ্যে এন প্রস্থ যুক্ত করতে চান তবে আপনার 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

গ্রিডউইথমার্গিনস ক্লাস তৈরির আগে যেমন বলা হয়েছিল। এখানে আমার কাজের কোড উদাহরণ

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
সিস্টেমকে ফেলে দেয় rআর্গুমেন্ট এক্সেপশন: 'প্রস্থটি অবশ্যই অ-নেতিবাচক হওয়া উচিত।' রিয়েলথ। প্রস্থ - = ম্যাথ.মিন (আসল। প্রস্থ, রওমার্গিন। লেফট + রোমার্জিন.রাইট); আসল.হাইট - = ম্যাথ.মিন (আসল।হাইট, রোমার্জিন.টপ + রওমার্গিন.বটম);
জেমি মেলওয়ে

জেমির ফিক্সের সাথে, এটি চলমান, তবে এখনও এটি করা উচিত নয়। সারি উচ্চতা এবং কলামের প্রস্থ অটোতে সেট করা সহ এটি ভুল উপায়ে অন্যভাবে করে।
15ee8f99-57ff-4f92-890c-b56153

0

আমি অবাক হই আমি এখনও এই সমাধান পোস্ট করা দেখতে পেলাম না।

ওয়েব থেকে আসা, বুটস্ট্র্যাপের মতো ফ্রেমওয়ার্কগুলি সারি / কলামগুলি পিছনে টানতে নেতিবাচক মার্জিন ব্যবহার করবে।

এটি কিছুটা ভার্বোজ হতে পারে (যদিও এটি খারাপ না), এটি কাজ করে এবং উপাদানগুলি সমানভাবে ব্যবধানে এবং আকারযুক্ত হয়।

নীচের উদাহরণে আমি এ ব্যবহার করি StackPanel 3 টি বোতামটি কীভাবে মার্জিনগুলি ব্যবহার করে সমানভাবে ব্যবধান করা হয় তা দেখানোর রুট । আপনি অন্যান্য উপাদান ব্যবহার করতে পারেন, কেবল অভ্যন্তরীণ এক্স পরিবর্তন করুন: বোতাম থেকে আপনার উপাদানটিতে টাইপ করুন।

ধারণাটি সহজ, অভ্যন্তরের গ্রিডের অর্ধেক পরিমাণ (নেতিবাচক মার্জিন ব্যবহার করে) উপাদানগুলির মার্জিনগুলি তাদের সীমানার বাইরে টানতে বাইরে একটি গ্রিড ব্যবহার করুন, অভ্যন্তরের গ্রিডটি আপনার পছন্দমতো পরিমাণের সাথে উপাদানগুলিকে সমানভাবে স্থান করতে ব্যবহার করুন।

আপডেট: কোনও ব্যবহারকারীর কিছু মন্তব্য বলেছে যে এটি কাজ করে না, এখানে একটি দ্রুত ভিডিও প্রদর্শিত হচ্ছে: 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

কখনও কখনও সহজ পদ্ধতি সেরা। কেবল আপনার স্ট্রিংগুলিকে স্পেস দিয়ে প্যাড করুন। এটি যদি কেবল কয়েকটি পাঠ্যবাক্স ইত্যাদি হয় তবে এটি খুব সহজ পদ্ধতি।

আপনি একটি নির্দিষ্ট আকারের সাথে খালি কলাম / সারিগুলি সন্নিবেশ করতে পারেন। অত্যন্ত সহজ এবং আপনি সহজেই এটি পরিবর্তন করতে পারেন।


সম্ভবত কারণ এটি খুব ভাল পদ্ধতি নয়। স্পেস ব্যবহার করা "সহজ উপায়" হতে পারে, তবে এটি আসলে হ্যাকের বেশি। এটি সুনির্দিষ্ট নয়, এটি আলাদাভাবে এবং অবিশ্বাস্যভাবে আলাদা স্কেলিং সহ মনিটরের উপর রেন্ডার হতে পারে এবং আপনার তৈরি করা স্থানের সঠিক পরিমাণের উপর আপনার কোনও নিয়ন্ত্রণ নেই। ফাঁকা কলাম ঢোকানো / সারি আপনার গ্রিড ধেড়ান হবে ...
মার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.