ডাব্লুপিএফ-তে রেডিও বোতামের মতো কাজ করতে কীভাবে একটি দল টগল বোতাম পাবেন?


122

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

আচরণটি ফটোশপ সরঞ্জামদণ্ডের মতো হবে, যেখানে যে কোনও সময় শূন্য বা কোনও একটি নির্বাচিত হয়!

এটি কীভাবে ডাব্লুপিএফ বাস্তবায়িত করা যায় ধারণা?

উত্তর:


38

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

<Style TargetType="{x:Type ListBox}">
    <Setter Property="ListBox.ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <ToggleButton Content="{Binding}" 
                              IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"
                />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

তারপরে আপনি সিঙ্গেল সিলেক্ট বনাম মাল্টিলেক্ট পরিচালনা করতে তালিকার বাক্সের সিলেকশনমড বৈশিষ্ট্যটি ব্যবহার করতে পারেন।


ভাগ করার জন্য আপনাকে ধন্যবাদ! আমি ভাবছিলাম যে এটি ভাল অনুশীলন কিনা ... তবে এটি ঠিক আছে বলে মনে হচ্ছে ..
গরিলাএপ

1
@ লিওলুভিয়ার: আপনি কেন বিস্তারিত বলবেন তা যত্ন নেবেন? আইটেম টেমপ্লেটটি কীভাবে ব্যবহার করতে হবে তা কি এটির উদাহরণ নয়?
বা ম্যাপার

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

চাকা পুনরুদ্ধার কেন?
ভবলস

300

এটি আমার মতে সবচেয়ে সহজ উপায়।

<RadioButton Style="{StaticResource {x:Type ToggleButton}}" />

উপভোগ করুন! - প্রিক্সো


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

16
অথবা, যদি আপনাকে কোনও এলিমেন্টের (যেমন একটি Grid) অভ্যন্তরে সমস্ত রেডিওব্যাটনে এটি প্রয়োগ করতে হয় তবে ব্যবহার করুন <Grid.Resources> <Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}" /> </Grid.Resources>
রোমান স্টারকভ

16
এই পদ্ধতির একটি অসুবিধা হ'ল আপনি চেক করা কোনওটিতে ক্লিক করে কোনও রেডিও বোতামটি চেক করতে পারবেন না।
জুলিয়েন

2
এই জাতীয় টগলবাটনে কোনওভাবে কাস্টম স্টাইল ব্যবহার করা যেতে পারে?
আশ্চর্য

2
@ ওয়ানড্রা আপনি কেবল একটি ফ্রেমওয়ার্ক এলিমেটে একটি একক স্টাইল বরাদ্দ করতে পারেন। তবে, আপনি রোমকিনস দ্রবণটি গ্রহণ করতে পারেন এবং টগল বাটন স্টাইল থেকে উত্তরাধিকারী হতে পারেন:<Style BasedOn="{StaticResource {x:Type ToggleButton}}" x:Key="Blubb" TargetType="RadioButton"><Setter Property="Background" Value="Yellow" /></Style>
স্যুইগি

32
<RadioButton Content="Point" >
    <RadioButton.Template>
        <ControlTemplate>
            <ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                          Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
        </ControlTemplate>
    </RadioButton.Template>
</RadioButton>

এটা আমার জন্য কাজ করে, উপভোগ করুন!


আমি জানি এটা প্রশ্ন নয়। তবে কি করতে হবে যদি বোতামটি এমন রেডিওব্যাটনের মতো আচরণ করে যেখানে সর্বদা একজনকে নির্বাচন করা উচিত?
কার্স্টেন

আমার নিজের প্রশ্নের উত্তর দিতে: উদয় কিরণের উত্তরটি পড়ুন :-)
কার্সটেন

দুর্দান্ত, টগল বোতামের মতো একই কাজ করুন। চেক করতে ক্লিক করুন এবং আনচেক করতে একই বোতামে ক্লিক করুন। এবং একবার আমি সমস্ত রেডিওবটনগুলি একই গ্রুপে রাখি, এটি রেডিও বোতামগুলির মতো কাজ করে। আপনাকে রোককে ধন্যবাদ !!!
মিলি

2
এটি একটি ভাল সমাধান। যাইহোক, যখন আমাদের কোনও ইভেন্ট হবে। এটি দুইবার বলা হবে।
খেম-কিম হো জুয়ান

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

5

আপনি সবসময় টগলবাটনের ক্লিকে একটি জেনেরিক ইভেন্ট ব্যবহার করতে পারেন যা সমস্ত টোগলবাটনকে সেট করে। যা একটি গ্রুপকন্ট্রোল (গ্রিড, র‌্যাপপ্যানেল, ...) চেক করা হয়েছে ভিজ্যুয়ালটিহেল্পারের সাহায্যে মিথ্যা হিসাবে; তারপরে প্রেরককে পুনরায় চেক করুন। বা পছন্দ মত কিছু।

private void ToggleButton_Click(object sender, RoutedEventArgs e)
    {
        int childAmount = VisualTreeHelper.GetChildrenCount((sender as ToggleButton).Parent);

        ToggleButton tb;
        for (int i = 0; i < childAmount; i++)
        {
            tb = null;
            tb = VisualTreeHelper.GetChild((sender as ToggleButton).Parent, i) as ToggleButton;

            if (tb != null)
                tb.IsChecked = false;
        }

        (sender as ToggleButton).IsChecked = true;
    }

4

আপনি এটিতে রেডিওব্যাটনের সাহায্যে গ্রিড লাগাতে পারেন এবং রডিয়োবট্টনের জন্য টেমপ্লেটের মতো বোতাম তৈরি করতে পারেন। আপনি প্রোগ্রাম বোতাম টগল করতে চান না শুধুমাত্র প্রোগ্রামমেটিকাল চেক অপসারণ চেয়ে


কিন্তু রেডিও বোতাম ব্যবহার করে কি সমস্ত বোতামটি অনির্বাচিত করার উপায় আছে? একবার নির্বাচিত হয়ে গেলে, এটিকে নির্বাচন থেকে মুক্ত করার সহজ উপায় আমি দেখছি না!
কোড-জুপ

রেডিওবাটনের একটি ইস্কেচড সম্পত্তি আছে, আপনি যখন প্রয়োজন তখন কোডে এটি মিথ্যাতে সেট করতে পারেন
আর্সেন এমকিটচায়ান

2

আপনি চেষ্টা করতে পারেন System.Windows.Controls.Primitives.ToggleButton

 <ToggleButton Name="btnTest" VerticalAlignment="Top">Test</ToggleButton>

তারপরে IsCheckedরেডিওবোটন প্রভাবটি নকল করতে সম্পত্তিটির বিরুদ্ধে কোড লিখুন

 private void btnTest_Checked(object sender, RoutedEventArgs e)
 {
     btn2.IsChecked = false;
     btn3.IsChecked = false;
 }

এটি খুবই জেনেরিক এবং পুনর্ব্যবহারযোগ্য না ... উদাহরণস্বরূপ, এটা ব্যবহারযোগ্য ভিতরে না ListBoxItemসে।
এভিনিস

0

আমি এটি রিবনটগলব্যাটনের জন্য করেছি তবে নিয়মিত টগলব্যাটনের ক্ষেত্রেও এটি একই রকম হতে পারে।

আমি EnumToBooleanConverter ব্যবহার করে এখান থেকে প্রতিটি বোতামের জন্য "মোড" এনুম মানটির সাথে আইসচেকড বেঁধে রেখেছি কীভাবে রেডিওবাটনগুলিকে একটি এনামের সাথে বাঁধবেন ? (কনভার্টারপ্যারামিটার ব্যবহার করে এই বোতামটির জন্য এনাম মান নির্দিষ্ট করুন each প্রতিটি বোতামের জন্য আপনার একটি এনাম মান থাকতে হবে)

তারপরে ইতিমধ্যে চেক করা একটি বোতামটি অনিচ্ছুক প্রতিরোধ করতে, প্রতিটি রিবন টগলব্যাটনের জন্য ক্লিক ইভেন্টের জন্য এটি আপনার কোডের পিছনে রাখুন:

    private void PreventUncheckRibbonToggleButtonOnClick ( object sender, RoutedEventArgs e ) {

        // Prevent unchecking a checked toggle button - so that one always remains checked
        // Cancel the click if you hit an already-checked button

        var button = (RibbonToggleButton)sender;
        if( button.IsChecked != null ) { // Not sure why checked can be null but that's fine, ignore it
            bool notChecked = ( ! (bool)button.IsChecked );
            if( notChecked ){ // I guess this means the click would uncheck it
                button.IsChecked = true; 
            }
        }
    }

0

জুলিয়ান এবং আমার মতো লোকদের সহায়তা করার জন্য (দুই মিনিট আগে ...)। আপনি এটি থেকে উদ্ভূত করতে পারেন RadioButton

class RadioToggleButton : RadioButton
{
    protected override void OnToggle()
    {
        if (IsChecked == true) IsChecked = IsThreeState ? (bool?)null : (bool?)false;
        else IsChecked = IsChecked.HasValue;
    }
}

তারপরে, আপনি উদয় কিরণের পরামর্শ মতো এটি ব্যবহার করতে পারেন ...

<Window x:Class="Sample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Sample"
    Title="MainWindow" Height="600" Width="600">
    <StackPanel>
        <local:RadioToggleButton Content="Button" Style="{StaticResource {x:Type ToggleButton}}" />
    </StackPanel>
</Window>

এই পদ্ধতিটি একবারে কেবল একজনকে ToggleButtonথাকতে Checkedদেয় এবং এটি আনচেকিংয়েরও অনুমতি দেয়।


0

আমি উত্তরগুলির কয়েকটি অংশ নিয়ে কিছু অতিরিক্ত কোড যুক্ত করেছি। এখন আপনার কাছে টগল বোতামের বিভিন্ন গোষ্ঠী থাকতে পারে যা একটি টগল বোতামের মতো কাজ করে:

<UserControl.Resources>
    <Style x:Key="GroupToggleStyle" TargetType="ToggleButton">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding GroupName, RelativeSource={RelativeSource Self}}" Value="Group1"/>
                    <Condition Binding="{Binding BooleanProperty}" Value="true"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="IsChecked" Value="true"/>
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

এবং রেডিও বোতামগুলির বিভিন্ন গোষ্ঠী যা টগল বোতামগুলির মতো দেখায়:

<Radio Button GroupName="Group1" Style="{StaticResource {x:Type ToggleButton}}">
<Radio Button GroupName="Group1" Style="{StaticResource {x:Type ToggleButton}}">
<Radio Button GroupName="Group2" Style="{StaticResource {x:Type ToggleButton}}">
<Radio Button GroupName="Group3" Style="{StaticResource {x:Type ToggleButton}}">
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.