WPF- এ গ্রিড সারিটি লুকান H


96

ফর্মটিতে Gridঘোষিত একটি সাধারণ ডাব্লুপিএফ ফর্ম আমার কাছে রয়েছে । এই Gridসারি একটি গুচ্ছ আছে:

<Grid.RowDefinitions>
    <RowDefinition Height="Auto" MinHeight="30" />
    <RowDefinition Height="Auto" Name="rowToHide" />
    <RowDefinition Height="Auto" MinHeight="30" />
</Grid.RowDefinitions>

নামের সারিটিতে rowToHideকয়েকটি ইনপুট ক্ষেত্র রয়েছে এবং সনাক্ত করার পরে আমার এই ক্ষেত্রগুলির প্রয়োজন নেই আমি এই সারিটি আড়াল করতে চাই। কেবল Visibility = Hiddenসারিটির সমস্ত আইটেম সেট করার পক্ষে এটি যথেষ্ট সহজ তবে সারিটি এখনও এর মধ্যে স্থান নেয় Grid। আমি Height = 0আইটেমগুলিতে সেট করার চেষ্টা করেছি , তবে এটি কার্যকর হয়নি বলে মনে হচ্ছে।

আপনি এটির মতো এটি ভাবতে পারেন: আপনার একটি ফর্ম রয়েছে, সেখানে "পেমেন্টের ধরণ" বলে আপনার একটি ড্রপ ডাউন রয়েছে এবং সেই ব্যক্তি যদি "নগদ" নির্বাচন করেন, আপনি কার্ডের বিশদ সম্বলিত সারিটি আড়াল করতে চান। ইতিমধ্যে এই লুকানো দিয়ে ফর্মটি শুরু করার কোনও বিকল্প নয়।


4
দৃশ্যমানতার জন্য এই 3 টি স্টেট সিস্টেম (ডাব্লুপিএফ টিপস থ্রেডে) হওয়ার জন্য এই টিপটি দেখুন: স্ট্যাকওভারফ্লো
মেট্রো স্মুরফ

উজ্জ্বল স্টাফ ... যদি আপনি এটি উত্তর হিসাবে রেখে দেন তবে আমি চিহ্নিত করতাম ...
রিচার্ড

উত্তর:


89

সারিটির কোনও দৃশ্যমান সম্পত্তি নেই, তাই অন্যরা যেমন বলেছে, আপনাকে উচ্চতা নির্ধারণ করতে হবে। আর একটি বিকল্প রূপান্তরকারী ব্যবহার করা উচিত, যদি আপনাকে অনেক দর্শনে এই কার্যকারিতাটির প্রয়োজন হয়:

    [ValueConversion(typeof(bool), typeof(GridLength))]
    public class BoolToGridRowHeightConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((bool)value == true) ? new GridLength(1, GridUnitType.Star) : new GridLength(0);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {    // Don't need any convert back
            return null;
        }
    }

এবং তারপরে উপযুক্ত দৃশ্যে <Grid.RowDefinition>:

<RowDefinition Height="{Binding IsHiddenRow, Converter={StaticResource BoolToGridRowHeightConverter}}"></RowDefinition>

10
আপভোটড - রূপান্তরকারীরা Xaml এ সমস্ত ঘোষিত হতে অনুমতি দেয়। আমি সাধারণত ভিজ্যুয়াল স্টাফগুলির সাথে ফিডলগুলিতে কোড-ব্যাক ব্যবহার করে ঘৃণা করি।
অ্যালেন

4
এটি বেশ কার্যকর এবং সহজেই প্রসারিত হতে পারে। আমি এটিকে কল করার BoolToGridLengthConverterএবং একটি- VisibleLengthপ্রপার্টি যুক্ত করার পরামর্শ দিচ্ছি , ফিরে যেতে (bool)value == true। আপনি কীভাবে এটি Autoকোনও যেকোন স্থির-মান দিয়ে পুনরায় ব্যবহার করতে পারবেন তা ts
লাকিলিকি

4
দুর্দান্ত উত্তর। আমি ধরে নিয়েছি আপনি ইসডিস্প্লেড রো বলতে চাইছেন, ইসহিডেনরো নয়।
নিলডাব্লু

73

সারি বা কলামগুলি ভেঙে যাওয়ার সর্বোত্তম এবং পরিষ্কার সমাধান হ'ল ডেটা ট্রিগার ব্যবহার করা যাতে আপনার ক্ষেত্রে হয়:

<Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" MinHeight="30" />
      <RowDefinition Name="rowToHide">
        <RowDefinition.Style>
          <Style TargetType="{x:Type RowDefinition}">
            <Setter Property="Height" Value="Auto" />
            <Style.Triggers>
              <DataTrigger Binding="{Binding SomeBoolProperty}" Value="True">
                <Setter Property="Height" Value="0" />
              </DataTrigger>
            </Style.Triggers>
          </Style>
        </RowDefinition.Style>
      </RowDefinition>
      <RowDefinition Height="Auto" MinHeight="30" />
    </Grid.RowDefinitions>
  </Grid>

5
আমি এই পদ্ধতির পছন্দ করি কারণ আপনার অ্যাডিটোনাল সি # কোডের প্রয়োজন নেই।
ব্যবহারকারী 11909

4
INotifyPropertyChangedআপনার কোডটি SomeBoolPropertyপরিবর্তন করার সময় এটির জন্য পিছনে প্রয়োগ করতে ভুলবেন না :)।
বেনিচকা 12

55

আপনি গ্রিডে সারিটি উল্লেখ করে এবং তারপরে সারিটির উচ্চতা পরিবর্তন করেও এটি করতে পারেন।

এক্সএএমএল

<Grid Grid.Column="2" Grid.Row="1" x:Name="Links">
   <Grid.RowDefinitions>
      <RowDefinition Height="60" />
      <RowDefinition Height="*" />
      <RowDefinition Height="*" />
      <RowDefinition Height="80" />
   </Grid.RowDefinitions>
</Grid>

ভিবি.এনইটি

If LinksList.Items.Count > 0 Then
   Links.RowDefinitions(2).Height = New GridLength(1, GridUnitType.Star)
Else
   Links.RowDefinitions(2).Height = New GridLength(0)
End If

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


4
এর মধ্যেও সারিগুলির সাথে কাজ করার সুবিধা রয়েছে যা তারা চিহ্নিতকরণ ব্যবহার করে!
জনি স্কোভডাল

4
কোডে এটি করা হ'ল পরিষ্কার, সর্বাধিক পঠনযোগ্য সমাধান। সম্ভবত:RowDefinition<RowDefinition Height="*" /><!-- Height set in code behind -->
কে জেড

4
ফাংশনাল কোডটি দুটি বিভক্ত ফাইলগুলিতে বিভক্ত হওয়ায় এটি পরিষ্কার এবং সর্বাধিক পঠনযোগ্য সমাধান বলে আমি মনে করি না। আসলে এটি খাঁটি এক্সএএমএল দিয়ে করা যায় - আমার উত্তর দেখুন।
লুকা কোটেন

আমার প্রয়োজনগুলি কিছুটা আলাদা এবং সি # তে ছিল তবে এই উদাহরণটি আমাকে সঠিক দিকে নির্দেশ করেছে। ধন্যবাদ!
nrod

30

অবগতির জন্য, Visibilityতিন রাষ্ট্র System.Windows.Visibility শুমার:

  • দৃশ্যমান - উপাদানটি রেন্ডার হয়ে যায় এবং বিন্যাসে অংশ নেয়।
  • সঙ্কুচিত - উপাদানটি অদৃশ্য এবং লেআউটে অংশ নেয় না। কার্যকরভাবে এটিকে 0 এর উচ্চতা এবং প্রস্থ দেওয়া এবং এমন আচরণ করা যেন এটির অস্তিত্ব নেই।
  • লুকানো - উপাদানটি অদৃশ্য তবে লেআউটে অংশ নিতে চলেছে।

ডাব্লুপিএফ টিপস এবং ট্রিকস থ্রেডে এই টিপ এবং অন্যান্য টিপস দেখুন ।


4
সারিতে সমস্ত আইটেম ভিজিবিলিটিতে সেট করা Col কাজ করা হয়েছে, ধন্যবাদ।
রিচার্ড

4
আমি এটিকে অগ্রাহ্য করেছি কারণ আমি মনে করি @ ট্র্যাভিসপুকের উত্তরে আরও পরিষ্কার, আরও সুস্পষ্ট সমাধান রয়েছে।
টেস্টপ্যাটার্ন

11
@ টেস্টপ্যাটার্ন - ডাউনভোটগুলি সাধারণত ভুল উত্তরের জন্য ব্যবহৃত হয়। যদি অন্য উত্তরটি আরও ভাল হয় তবে কেবল এটি উত্সাহিত করুন।
মেট্রো স্মুরফ

6
@ মেট্রোস্মার্ফ মেলা যথেষ্ট। যুক্তিযুক্তভাবে, আপনার উত্তরটি সঠিক নয় কারণ রাউডিফিনিশনে দৃশ্যমানতার জন্য কোনও সম্পত্তি নেই। ট্র্যাভিসপুক দেখায় যে কীভাবে একটি সারি লুকিয়ে রাখা যায় এবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
টেস্টপ্যাটার্ন

8

গ্রিড সারিটির সাথে ঝাঁকুনির পরিবর্তে আপনি নিয়ন্ত্রণগুলির (সারির ক্ষেত্রগুলি) এর দৃশ্যমান বৈশিষ্ট্যটিকে "সঙ্কুচিত" করতে পারেন। এটি নিশ্চিত করবে যে নিয়ন্ত্রণগুলি কোনও স্থান গ্রহণ করবে না এবং যদি আপনার গ্রিড রো উচ্চতা = "অটো" থাকে তবে সারিটির সমস্ত কন্ট্রোলের দৃশ্যমানতা = "সঙ্কুচিত" থাকায় সারিটি লুকানো থাকবে।

<Grid>
       <Grid.RowDefinitions>
         <RowDefinition Height="Auto" />
         <RowDefinition Height="Auto" Name="rowToHide" />
       </Grid.RowDefinitions>

   <Button Grid.Row=0 Content="Click Me" Height="20">
       <TextBlock Grid.Row=1 
Visibility="{Binding Converter={StaticResource customVisibilityConverter}}" Name="controlToHide"/>

</Grid>

এই পদ্ধতিটি আরও ভাল কারণ নিয়ন্ত্রণগুলির দৃশ্যমানতা কোনও কনভার্টারের সাহায্যে কিছু সম্পত্তিতে আবদ্ধ হতে পারে।


7

কেবল এটি করুন:
rowToHide.Height = new GridLength(0);

আপনি যদি ব্যবহার করেন visibility.Collapseতবে আপনাকে এটি সারির প্রতিটি সদস্যের জন্য নির্ধারণ করতে হবে।


6

সারিটির সামগ্রীটির দৃশ্যমানতা গোপনের Visibility.Collapsedপরিবর্তে সেট করুন । এটি সামগ্রীটি স্থান গ্রহণ বন্ধ করবে এবং সারিটি যথাযথভাবে সঙ্কুচিত হবে।


4
আমি অন্য কোথাও দেখেছি কেউ সারি দৃশ্যমানতার উল্লেখ করেছে। তবে সারিটির কোন দৃশ্যমান অবস্থা নেই? সারিতে সমস্ত আইটেমটি ভিজিবিলিটিতে সেট করা হচ্ছে Col
রিচার্ড

5
@ রিচার্ড: আপনি রাউডফিনিশন সেট করতে পারবেন না Vভিজিবিলিটি যেহেতু এটি ইউআইএলিমেন্ট নয় - তবে আপনি সারিটির জন্য (বা সারির প্রতিটি কলামের জন্য) সমস্ত সামগ্রী একক পাত্রে রেখে, এবং সেই ধারকটির দৃশ্যমানতা সেট করতে পারেন।
রিড কোপসি

4
যদি আপনার গ্রিড সারিতে কোনও সামগ্রী না থাকে তবে একটি উচ্চতা স্থির থাকে? দেখানোর / আড়াল করার কোনও সুবিধাজনক উপায় আছে কি?
কেভিনার্পে

4

রাউডিফিনিশন উত্তরাধিকারসূত্রে প্রাপ্ত (একইভাবে আগ্রহের জন্য) আমারও একই ধারণা ছিল

public class MyRowDefinition : RowDefinition
{
    private GridLength _height;

    public bool IsHidden
    {
        get { return (bool)GetValue(IsHiddenProperty); }
        set { SetValue(IsHiddenProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsHidden.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsHiddenProperty =
        DependencyProperty.Register("IsHidden", typeof(bool), typeof(MyRowDefinition), new PropertyMetadata(false, Changed));

    public static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var o = d as MyRowDefinition;
        o.Toggle((bool)e.NewValue);
    }

    public void Toggle(bool isHidden)
    {
        if (isHidden)
        {
            _height = this.Height;
            this.Height = new GridLength(0, GridUnitType.Star);
        }                                                     
        else
            this.Height = _height;
    }          
}

এখন আপনি এটি নিম্নলিখিত হিসাবে ব্যবহার করতে পারেন:

 <Grid.RowDefinitions>
        <RowDefinition Height="2*" />
        <my:MyRowDefinition Height="4*" IsHidden="false" x:Name="RowToHide" />
        <RowDefinition Height="*" />
        <RowDefinition Height="60" />
    </Grid.RowDefinitions>

এবং সাথে টগল করুন

RowToHide.IsHidden = !RowToHide.IsHidden;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.