ডাব্লুপিএফ: শতাংশের মান হিসাবে প্রস্থ (এবং উচ্চতা) নির্ধারণ করা


149

বলুন আমি TextBlockতার Widthপিতামাতার ধারকটির সমান Width(যেমন, পাশ থেকে পাশ প্রসারিত) বা এর পিতামাতার ধারকটির শতকরা একটি অংশ চাই Width, আমি কীভাবে XAMLপরম মানগুলি উল্লেখ না করে এটি সম্পাদন করতে পারি ?

আমি এটি করতে চাই যাতে পিতামাত্রে ধারক ধারকটি যদি পরে প্রসারিত হয় (এর ' Widthবৃদ্ধি) হয় তবে এর' শিশু উপাদানগুলিও স্বয়ংক্রিয়ভাবে প্রসারিত হবে। (মূলত, এইচটিএমএল এবং সিএসএসের মতো)



Cwap এর উত্তর ব্যবহার করুন এবং একটি গ্রিড সেটিংসে প্রসারিত করতে প্রান্তিককরণের সাথে টিবি অন্তর্ভুক্ত করুন।
শিমি ওয়েটজ্যান্ডলার

উত্তর:


90

প্যারেন্ট পাত্রে একই আকারে প্রসারিত করার উপায়টি বৈশিষ্ট্যটি ব্যবহার করা হয়:

 <Textbox HorizontalAlignment="Stretch" ...

এটি পাঠ্যবাক্স উপাদানটি অনুভূমিকভাবে প্রসারিত করবে এবং সমস্ত প্যারেন্ট স্পেসকে অনুভূমিকভাবে পূরণ করবে (আসলে এটি আপনি যে প্যারেন্ট প্যানেলটি ব্যবহার করছেন তার উপর নির্ভর করে তবে বেশিরভাগ ক্ষেত্রে এটি কাজ করা উচিত)।

শতাংশগুলি কেবল গ্রিড কক্ষের মানগুলির সাথে ব্যবহার করা যায় তাই অন্য একটি বিকল্প হ'ল গ্রিড তৈরি করা এবং যথাযথ শতাংশের সাথে আপনার পাঠ্যবক্সটি কোনও একটি ঘরেই স্থাপন করা।


221

গ্রিডের সারি বা কলামগুলিতে শতাংশের মান করতে আপনি পাঠ্যের বাক্সগুলিকে গ্রিডের ভিতরে রাখতে পারেন এবং পাঠ্যবাক্সগুলি তাদের পিতামাতার কক্ষে স্বয়ংক্রিয়ভাবে পূরণ করতে দিন (তারা পূর্বনির্ধারিতভাবে হবে)। উদাহরণ:

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

    <TextBox Grid.Column="0" />
    <TextBox Grid.Column="1" />
</Grid>

এটি প্রস্থের # 1 2/5 এবং # 2 3/5 করবে।


7
আমি ইতিমধ্যে এটি চেষ্টা করেছি, তবে আমি এই ত্রুটিটি পাচ্ছি: '2 *' স্ট্রিংটি দৈর্ঘ্যে রূপান্তরিত হতে পারে না ''
আন্দ্রেয়াস গ্রেচ


73
আমার মা বলেন আমি একটি তারকা
ডেনিস ওয়েসেলস

7
টেক্সটবক্স গ্রিডে থাকলেও এটি কাজ করে না। প্রস্থটি একটি ডাবল, যোগ্য ডাবল (px এর পরে একটি ডাবল মান, ইন, সেমি বা পিটি) বা অটোতে সেট করা যেতে পারে। দেখুন msdn.microsoft.com/en-GB/library/...
ড্যারেন

2
হ্যাঁ .. এটি আসলে খুব খারাপ জবাব, তবে সমস্ত উত্সের উপর ভিত্তি করে, আমি মনে করি এটি কোনও ব্যক্তিকে সাহায্য করেছিল (অনেক দিন আগে ছিল), সে কারণেই আমি এটি মুছে ফেলিনি।
cwap

58

সাধারণত, আপনি আপনার দৃশ্যের জন্য উপযুক্ত একটি বিল্ট-ইন লেআউট নিয়ন্ত্রণ ব্যবহার করবেন (যেমন আপনি পিতামাতার সাথে সম্পর্কিত যদি স্কেলিং চান তবে পিতামাতার হিসাবে গ্রিড ব্যবহার করুন)। যদি আপনি এটি একটি স্বেচ্ছাসেবক অভিভাবক উপাদান দিয়ে করতে চান, আপনি এটি করতে একটি ValueConverter তৈরি করতে পারেন, তবে এটি সম্ভবত আপনি চান তেমন পরিষ্কার হবে না। তবে আপনার যদি একেবারেই প্রয়োজন হয় তবে আপনি এটির মতো কিছু করতে পারেন:

public class PercentageConverter : IValueConverter
{
    public object Convert(object value, 
        Type targetType, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        return System.Convert.ToDouble(value) * 
               System.Convert.ToDouble(parameter);
    }

    public object ConvertBack(object value, 
        Type targetType, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

কোনটি তার পিতামাতার ক্যানভাসের প্রস্থের 10% প্রস্থের চাইল্ড টেক্সটবক্স পেতে এটির মতো ব্যবহার করা যেতে পারে:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <local:PercentageConverter x:Key="PercentageConverter"/>
    </Window.Resources>
    <Canvas x:Name="canvas">
        <TextBlock Text="Hello"
                   Background="Red" 
                   Width="{Binding 
                       Converter={StaticResource PercentageConverter}, 
                       ElementName=canvas, 
                       Path=ActualWidth, 
                       ConverterParameter=0.1}"/>
    </Canvas>
</Window>

এটি সত্যিই দুর্দান্ত, আমি কীভাবে কোডটিতে এটি করতে পারি (পাঠ্যবক্সের প্রস্থটি সেট করব)?
জেরেমি

9
CultureInfo.InvariantCultureআপনার দ্বিগুণ রূপান্তর যুক্ত করার কথা বিবেচনা করা উচিত কারণ এটি সংস্কৃতির parameterহিসাবে বিবেচিত হয় stringএবং বিভিন্ন সংস্কৃতিতে decimal separatorএটি প্রত্যাশার মতো কাজ করে না।
ফ্ল্যাট এরিক

33

যে কেউ এর মতো ত্রুটি পাচ্ছে তার জন্য: '2 *' স্ট্রিংটি দৈর্ঘ্যে রূপান্তরিত হতে পারে না।

<Grid >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" /><!--This will make any control in this column of grid take 2/5 of total width-->
        <ColumnDefinition Width="3*" /><!--This will make any control in this column of grid take 3/5 of total width-->
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition MinHeight="30" />
    </Grid.RowDefinitions>

    <TextBlock Grid.Column="0" Grid.Row="0">Your text block a:</TextBlock>
    <TextBlock Grid.Column="1" Grid.Row="0">Your text block b:</TextBlock>
</Grid>

না কেন <RowDefinition Height="auto" />?
বেন

2
"অটো" নিয়ন্ত্রণের যতটা জায়গা নেয় ঠিক তেমন স্থান নেয়
ইয়ামা

আপনাকে অনেক ধন্যবাদ, এটি শীর্ষ উত্তর হওয়া উচিত।
মাফাই

এটি অবশ্যই সেরা উত্তর।
নট ভ্যালেন

7

IValueConverter বাস্তবায়ন ব্যবহার করা যেতে পারে। IValueConverter থেকে উত্তরাধিকার গ্রহণকারী রূপান্তরকারী শ্রেণি value(শতাংশ) এবং parameter(পিতামাতার প্রস্থ) এর মতো কিছু পরামিতি নেয় এবং পছন্দসই প্রস্থের মান দেয়। এক্সএএমএল ফাইলে, উপাদানটির প্রস্থটি মান সহ পছন্দসই সাথে সেট করা হয়:

public class SizePercentageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (parameter == null)
            return 0.7 * value.ToDouble();

        string[] split = parameter.ToString().Split('.');
        double parameterDouble = split[0].ToDouble() + split[1].ToDouble() / (Math.Pow(10, split[1].Length));
        return value.ToDouble() * parameterDouble;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Don't need to implement this
        return null;
    }
}

XAML:

<UserControl.Resources>
    <m:SizePercentageConverter x:Key="PercentageConverter" />
</UserControl.Resources>

<ScrollViewer VerticalScrollBarVisibility="Auto"
          HorizontalScrollBarVisibility="Disabled"
          Width="{Binding Converter={StaticResource PercentageConverter}, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Border}},Path=ActualWidth}"
          Height="{Binding Converter={StaticResource PercentageConverter}, ConverterParameter=0.6, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Border}},Path=ActualHeight}">
....
</ScrollViewer>

4

আমি জানি এটি জ্যামল নয় তবে আমি পাঠ্যবক্সের সাইজ চেঞ্জড ইভেন্টের সাথে একই জিনিসটি করেছি:

private void TextBlock_SizeChanged(object sender, SizeChangedEventArgs e)
{
   TextBlock textBlock = sender as TextBlock;
   FrameworkElement element = textBlock.Parent as FrameworkElement;
   textBlock.Margin = new Thickness(0, 0, (element.ActualWidth / 100) * 20, 0);
}

পাঠ্যবক্সটি এর প্যারেন্টের 80% আকার হিসাবে দেখা যাচ্ছে (ভাল ডান পাশের মার্জিন 20%) এবং যখন প্রয়োজন হয় তখন প্রসারিত হয়।


4

আমি আপেক্ষিক আকারের জন্য দুটি পদ্ধতি ব্যবহার করি। আমার কাছে Relativeতিনটি সংযুক্ত বৈশিষ্ট্যযুক্ত একটি ক্লাস রয়েছে To, WidthPercentএবং HeightPercentএটি যদি দরকারী যদি আমি কোনও উপাদানটি চাক্ষুষ গাছের যে কোনও জায়গায় কোনও উপাদানের আপেক্ষিক আকার হতে চাই এবং রূপান্তর পদ্ধতির চেয়ে কম হ্যাকি বোধ করি - যদিও এটি আপনার পক্ষে কার্যকর তা ব্যবহার করে যে আপনি এর সাথে খুশি।

অন্য পদ্ধতি বরং আরও চালাকি। একটি যোগ করুন ViewBoxযেখানে আপনি আপেক্ষিক মাপ ভিতরে চান, তাহলে সেই ভিতরে, একটি যোগ Gridপ্রস্থ 100 এ তারপর আপনি একটি যোগ TextBlock10 যে ভিতরে প্রস্থ সঙ্গে, এটা স্পষ্টত 100-10%।

ViewBoxস্কেল হবে Gridযাই হোক না কেন স্থান এটা দেয়া হয়েছে অনুযায়ী, তাই যদি পৃষ্ঠাতে তার একমাত্র জিনিস, তারপর Gridবাইরে পুরো প্রস্থ ছোটো করা হবে এবং কার্যকরভাবে আপনার TextBlockপৃষ্ঠার 10% ছোটো করা হয়।

আপনি যদি কোনও উচ্চতা সেট না করেন Gridতবে এটির সামগ্রীতে ফিট করার জন্য এটি সঙ্কুচিত হবে, সুতরাং এটি সমস্ত অপেক্ষাকৃত আকারের হবে। আপনাকে নিশ্চিত করতে হবে যে সামগ্রীটি খুব বেশি লম্বা হবে না, অর্থাত স্থানটির দিক অনুপাত পরিবর্তন করা শুরু ViewBoxকরবে অন্যথায় এটি উচ্চতাও স্কেলিং শুরু করবে। আপনি সম্ভবত একটি Stretchএর সাথে এটিকে ঘিরে কাজ করতে পারেন UniformToFill

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