আমি কীভাবে একটি ডাব্লুপিএফ গোলাকার কর্নার ধারক তৈরি করব?


114

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


1
ক্যাভেট: আপনি যদি একটি বৃত্তাকার-আয়তক্ষেত্রের সীমানার ভিতরে পাঠ্যের একটি লাইন রাখেন তবে আমার মতো বয়স্ক লোকেরা এটি দেখে মনে করবে, "ম্যাকিনটোস'র 80 এর দশকের পুশ বোতাম!"
mjfgates

80 এর ম্যাকিনটোসকে আমি কতটা খারাপভাবে মিস করছি তা আপনার কোনও ধারণা নেই! আমি মনে করি যে এই প্রশ্নটি কোণে ক্লিপিং কাঙ্ক্ষিত কিনা তা স্পষ্ট করেই বলা উচিত কারণ নির্বাচিত উত্তরটি সীমানাটি ক্লিপ করে না।
এটিএল_ডিইভি

উত্তর:


266

আপনার কাস্টম নিয়ন্ত্রণের দরকার নেই, কেবল আপনার ধারকটিকে একটি সীমান্তের উপাদানটিতে রাখুন:

<Border BorderBrush="#FF000000" BorderThickness="1" CornerRadius="8">
   <Grid/>
</Border>

আপনি যে <Grid/>কোনও লেআউট পাত্রে এটি প্রতিস্থাপন করতে পারেন ...


30
যেকোন বেধের অবজেক্টের জন্য (বর্ডারথিকনেস বা কর্নাররেডিয়াস) আপনি 4 টির মতো একইরকম একক সংখ্যা নির্দিষ্ট করতে পারবেন যেমন কর্নাররেডিয়াস = "8"।
সান্টিয়াগো প্যালাডিনো

3
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="8">এটির জন্য উপযুক্ত প্রতিস্থাপন, খানিকটা বেশি সাফল্য
কাইরেন জনস্টোন

@ প্যাট্রিক দেওঘরে, আমাকে ভুল করবেন না, কোবসব দুর্দান্ত ... তবে আমার মনে হয় ডাব্লুপিএফ দলটি এটি তৈরি করার পক্ষে এবং এর সুবিধা গ্রহণ করা এত সহজ করার জন্য দুর্দান্ত ভয় পেয়েছিল। (যদিও কেউ যুক্তি দিতে পারে যে একটি আধুনিক ইউআই প্ল্যাটফর্ম যাতে এটি অন্তর্নির্মিত না ... সত্যই কোনও আধুনিক ইউআই প্ল্যাটফর্ম নয়))
cplotts

1
যাইহোক, সীমানা বাস্তবায়ন চূড়ান্ত আলোকিত ... যদি আপনি প্রচ্ছদের নীচে খননের মতো অনুভব করেন। উদাহরণস্বরূপ, এটি কীভাবে স্ট্রিমজিট্রি ব্যবহার করে ...
cplotts

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

54

আমি জানি যে এটি প্রাথমিক প্রশ্নের উত্তর নয় ... তবে আপনি প্রায়শই সবে তৈরি করা গোলাকার কোণার সীমানার অভ্যন্তরীণ সামগ্রীটি ক্লিপ করতে চান।

ক্রিস ক্যাভানাগ কেবল এটি করার জন্য দুর্দান্ত উপায় নিয়ে এসেছেন ।

আমি এটির জন্য বেশ কয়েকটি ভিন্ন পদ্ধতির চেষ্টা করেছি ... এবং আমি মনে করি এটি একদম শকুন।

নীচে xaml এখানে:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Background="Black"
>
    <!-- Rounded yellow border -->
    <Border
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        BorderBrush="Yellow"
        BorderThickness="3"
        CornerRadius="10"
        Padding="2"
    >
        <Grid>
            <!-- Rounded mask (stretches to fill Grid) -->
            <Border
                Name="mask"
                Background="White"
                CornerRadius="7"
            />

            <!-- Main content container -->
            <StackPanel>
                <!-- Use a VisualBrush of 'mask' as the opacity mask -->
                <StackPanel.OpacityMask>
                    <VisualBrush Visual="{Binding ElementName=mask}"/>
                </StackPanel.OpacityMask>

                <!-- Any content -->
                <Image Source="http://chriscavanagh.files.wordpress.com/2006/12/chriss-blog-banner.jpg"/>
                <Rectangle
                    Height="50"
                    Fill="Red"/>
                <Rectangle
                    Height="50"
                    Fill="White"/>
                <Rectangle
                    Height="50"
                    Fill="Blue"/>
            </StackPanel>
        </Grid>
    </Border>
</Page>

1
ব্ল্যাকলাইট কন্ট্রোলস (ব্ল্যাকলাইটকোডপ্লেক্স.কম ) এর একটি ক্লাইপিংবোর্ডার নামে একটি নিফটি সামান্য নিয়ন্ত্রণ রয়েছে যা আপনাকে আপনার বৃত্তাকার কোণগুলিতে সামগ্রীটি ক্লিপ করতে দেয়। ক্লিপিংবোর্ডার সম্পর্কে একটি দুর্দান্ত বিষয় হ'ল এটি কোনও ভিজ্যুয়াল ব্রাশ ব্যবহার করে না (যা সর্বাধিক ব্যয়ের (পারফরম্যান্সের দিক থেকে) ব্রাশ)।
cplotts

1
যাইহোক, আমি কেবল ক্লিপিংবোর্ডার বাস্তবায়নের অভ্যন্তরে একবার দেখেছি ... এবং এটি তার ডিফল্ট কন্ট্রোলটিপ্লেটে (প্রতিটি কোণার জন্য একটি) 4 টি কনটেন্ট কন্ট্রোল (গুলি) ব্যবহার করে ... সুতরাং আমি নিশ্চিত নই যে এটি কম-বেশি কিনা if উপরের ভিজুয়াল ব্রাশ পদ্ধতির চেয়ে পারফরম্যান্ট। আমি কম পারফরম্যান্ট অনুমান করব।
cplotts

ক্লিপিংয়ের প্রয়োজন হলে এটি উত্তর নির্বাচন করা উচিত।
এটিএল_ডিইভি

1
এটি করার একমাত্র আসল উপায়! এটি আশ্চর্যজনক যে এটি কোনও সীমানার ভিতরে থাকা উপাদানগুলির জন্য ডিফল্ট আচরণ নয়।
ইরান otzap

আপনি এই উত্তরটি পছন্দ করেছেন একমাত্র ক্ষতি হ'ল আপনি একটি ভিজুয়াল ব্রাশ ব্যবহার করছেন যা আরও বেশি পারফরম্যান্স ভারী আইটেম। নীচের আমার অন্য উত্তর আপনাকে কীভাবে এই ভিজ্যুয়াল ব্রাশ এড়ানো যায় তা দেখায় ...
cplotts

14

আমাকে কেবল এটি করতে হয়েছিল, তাই আমি ভেবেছিলাম যে আমি এখানে আরও একটি উত্তর পোস্ট করব।

বৃত্তাকার কোণার সীমানা তৈরি করতে এবং এর অভ্যন্তরীণ সামগ্রীটি ক্লিপ করার জন্য এখানে আরেকটি উপায় । এটি ক্লিপ সম্পত্তি ব্যবহার করে সোজা উপায়। আপনি যদি ভিজুয়াল ব্রাশ এড়াতে চান তবে এটি দুর্দান্ত।

এক্সামল:

<Border
    Width="200"
    Height="25"
    CornerRadius="11"
    Background="#FF919194"
>
    <Border.Clip>
        <RectangleGeometry
            RadiusX="{Binding CornerRadius.TopLeft, RelativeSource={RelativeSource AncestorType={x:Type Border}}}"
            RadiusY="{Binding RadiusX, RelativeSource={RelativeSource Self}}"
        >
            <RectangleGeometry.Rect>
                <MultiBinding
                    Converter="{StaticResource widthAndHeightToRectConverter}"
                >
                    <Binding
                        Path="ActualWidth"
                        RelativeSource="{RelativeSource AncestorType={x:Type Border}}"
                    />
                    <Binding
                        Path="ActualHeight"
                        RelativeSource="{RelativeSource AncestorType={x:Type Border}}"
                    />
                </MultiBinding>
            </RectangleGeometry.Rect>
        </RectangleGeometry>
    </Border.Clip>

    <Rectangle
        Width="100"
        Height="100"
        Fill="Blue"
        HorizontalAlignment="Left"
        VerticalAlignment="Center"
    />
</Border>

কনভার্টারের জন্য কোড:

public class WidthAndHeightToRectConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        double width = (double)values[0];
        double height = (double)values[1];
        return new Rect(0, 0, width, height);
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

খুব শীতল সমাধান। আমি একটি বোতামের জন্য একটি নিয়ন্ত্রণ টেম্পলেট তৈরি করছি যা বিভিন্ন রাজ্যে বাইরের আভাস এবং অভ্যন্তরীণ গ্লো উভয়ই প্রয়োজন এবং এটি সমস্যা সমাধানে সহায়তা করে।
কোয়ান্টা

2

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

        ' Create a ListBox of Buttons, one button for each MEF charting component. 
    For Each c As Lazy(Of ICharts, IDictionary(Of String, Object)) In ext.ChartDescriptions
        Dim brdr As New Border
        brdr.BorderBrush = Brushes.Black
        brdr.BorderThickness = New Thickness(2, 2, 2, 2)
        brdr.CornerRadius = New CornerRadius(8, 8, 8, 8)
        Dim btn As New Button
        AddHandler btn.Click, AddressOf GenericButtonClick
        brdr.Child = btn
        brdr.Background = btn.Background
        btn.Margin = brdr.BorderThickness
        btn.Width = ChartsLBx.ActualWidth - 22
        btn.BorderThickness = New Thickness(0, 0, 0, 0)
        btn.Height = 22
        btn.Content = c.Metadata("Description")
        btn.Tag = c
        btn.ToolTip = "Push button to see " & c.Metadata("Description").ToString & " chart"
        Dim lbi As New ListBoxItem
        lbi.Content = brdr
        ChartsLBx.Items.Add(lbi)
    Next

Public Event Click As RoutedEventHandler

Private Sub GenericButtonClick(sender As Object, e As RoutedEventArgs)
    Dim btn As Button = DirectCast(sender, Button)
    Dim c As Lazy(Of ICharts, IDictionary(Of String, Object)) = DirectCast(btn.Tag, Lazy(Of ICharts, IDictionary(Of String, Object)))
    Dim w As Window = DirectCast(c.Value, Window)
    Dim cc As ICharts = DirectCast(c.Value, ICharts)
    c.Value.CreateChart()
    w.Show()
End Sub

<System.ComponentModel.Composition.Export(GetType(ICharts))> _
<System.ComponentModel.Composition.ExportMetadata("Description", "Data vs. Time")> _
Public Class DataTimeChart
    Implements ICharts

    Public Sub CreateChart() Implements ICharts.CreateChart
    End Sub
End Class

Public Interface ICharts
    Sub CreateChart()
End Interface

Public Class Extensibility
    Public Sub New()
        Dim catalog As New AggregateCatalog()

        catalog.Catalogs.Add(New AssemblyCatalog(GetType(Extensibility).Assembly))

        'Create the CompositionContainer with the parts in the catalog
        ChartContainer = New CompositionContainer(catalog)

        Try
            ChartContainer.ComposeParts(Me)
        Catch ex As Exception
            Console.WriteLine(ex.ToString)
        End Try
    End Sub

    ' must use Lazy otherwise instantiation of Window will hold open app. Otherwise must specify Shutdown Mode of "Shutdown on Main Window".
    <ImportMany()> _
    Public Property ChartDescriptions As IEnumerable(Of Lazy(Of ICharts, IDictionary(Of String, Object)))

End Class

1

আপনি যদি বৃত্তাকার-আয়তক্ষেত্রের সীমানায় একটি বোতাম রাখার চেষ্টা করছেন, আপনার এমএসডিএন এর উদাহরণটি পরীক্ষা করা উচিত । আমি সমস্যার চিত্রগুলির জন্য (পাঠ্যের পরিবর্তে) গুগল করে এটি পেয়েছি। তাদের বিশাল বাইরের আয়তক্ষেত্রটি (কৃতজ্ঞতার সাথে) সরানো সহজ।

নোট করুন যে আপনাকে বোতামটির আচরণটি নতুনভাবে সংজ্ঞায়িত করতে হবে (যেহেতু আপনি কন্ট্রোলটিম্পলেটটি পরিবর্তন করেছেন)। এটি হ'ল, কন্ট্রোলটেম্পলেট. ট্রিগার্স ট্যাগটিতে একটি ট্রিগার ট্যাগ (সম্পত্তি = "ইস্প্রেসড" মান = "সত্য") ব্যবহার করে ক্লিক করার সময় আপনাকে বোতামটির আচরণ নির্ধারণ করতে হবে। আশা করি আমার হারিয়ে যাওয়ার সময় এটি অন্য কাউকে বাঁচায় :)

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