WPF में रेडियो बटन की तरह कार्य करने के लिए टॉगल बटन का एक समूह कैसे प्राप्त करें?


122

मेरे पास बटन का एक समूह है जो टॉगल बटन की तरह काम करना चाहिए, लेकिन रेडियो बटन के रूप में भी जहां एक समय में केवल एक बटन का चयन / दबाया जा सकता है। इसके लिए ऐसी अवस्था भी होनी चाहिए जहां कोई भी बटन चयनित / दबाया न जाए।

व्यवहार फ़ोटोशॉप टूलबार की तरह होगा, जहां शून्य या किसी भी उपकरण को किसी भी समय चुना जाता है!

किसी भी विचार को कैसे WPF में लागू किया जा सकता है?

जवाबों:


38

सबसे आसान तरीका है कि अपने ItemTemplate के लिए ToggleButtons का उपयोग करने के लिए एक लिस्टबॉक्स को स्टाइल करें

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

तब आप SingleSelect बनाम MultiSelect को संभालने के लिए ListBox की SelectionMode संपत्ति का उपयोग कर सकते हैं।


साझा करने के लिए धन्यवाद! मैं सोच रहा था कि क्या यह अच्छा अभ्यास है ... लेकिन यह ठीक लगता है ..
गोरिल्लाएप

1
@LeeLouviere: क्या आप विस्तार से ध्यान देंगे कि क्यों नहीं? आइटम टेम्पलेट का उपयोग कैसे करें का एक प्रमुख उदाहरण नहीं है?
या मैपर

4
यह एक बुरा उदाहरण है क्योंकि आप प्रदर्शन और व्यवहार को भ्रमित करते हैं। आप डेटेटप्लेट के माध्यम से डिस्प्ले को बदलते हैं लेकिन आपके पास अभी भी एक लिस्टबॉक्स का व्यवहार है कि रेडियो / टॉगल बटन के सेट का व्यवहार। कीबोर्ड इंटरैक्शन अजीब है। एक बेहतर समाधान रेडियोबुटन के साथ एक आइटमकंट्रोल होगा, जिसे टॉगलबटन (अन्य उच्चतम मतदान जवाब देखें) के रूप में स्टाइल किया जाएगा।
ज़राट

पहिया को क्यों मजबूत करें?
19 को Wobbles

300

मेरी राय में यह सबसे आसान तरीका है।

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

का आनंद लें! - प्रिक्सॉ


29
यह दूर से उत्तर चुना जाना चाहिए। कुछ कंट्रोलर से बाइंडिंग की कमियों के बिना आपको एक रेडियोबॉटन के सभी फायदे मिलते हैं। मैंने पहले अदृश्य रेडियोबूटन सेट को अलग करने के लिए बाध्य करने की कोशिश की, लेकिन वह अनावश्यक ओवरहेड था और एक बग के साथ समाप्त हो गया, जहां क्लिक किए गए सभी बटन हाइलाइट किए गए थे, लेकिन जरूरी नहीं कि जांच की गई हो।
ली लौविरे

16
या, यदि आपको किसी तत्व (जैसे Grid) के अंदर सभी RadioButtons पर इसे लागू करने की आवश्यकता है, तो उपयोग करें <Grid.Resources> <Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}" /> </Grid.Resources>
रोमन स्टार्कोव

16
इस पद्धति का एक नुकसान यह है कि आप चेक किए गए पर क्लिक करके रेडियो बटन को अनचेक नहीं कर सकते।
जूलियन

2
क्या इस तरह के टॉगलबटन पर कस्टम स्टाइल का इस्तेमाल किया जा सकता है?
वंद्रा

2
@wondra आप केवल फ्रेमवर्क के लिए एकल शैली असाइन कर सकते हैं। हालाँकि, आप रोमकिन के समाधान को अनुकूलित कर सकते हैं और टॉगलबटन शैली से विरासत में प्राप्त कर सकते हैं:<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>

यह मेरे लिए काम करता है, आनंद लें!


मुझे पता है कि यह सवाल नहीं है। लेकिन क्या करना चाहिए अगर बटन को रेडियोबुटन की तरह व्यवहार करना चाहिए, जहां हमेशा एक का चयन किया जाना चाहिए?
कर्स्टन

मेरे अपने प्रश्न का उत्तर देने के लिए: उदय किरण :-)
कार्स्टन

अच्छा है, यह टॉगल बटन के रूप में SAME के ​​रूप में कार्य करता है। चेक करने के लिए क्लिक करें और अनचेक करने के लिए एक ही बटन पर क्लिक करें। और एक बार जब मैंने सभी रेडियोबटन को एक ही समूह में रखा, तो यह रेडियो बटन की तरह काम करता है। धन्यवाद RoKK !!!
मिली

2
यह एक अच्छा उपाय है। हालांकि, जब हमारे पास एक घटना होती है। इसे दो बार कहा जाएगा।
खीम-किम हो ज़ुआन

यदि कोई अन्य सामग्री जोड़ें तो एक साधारण स्ट्रिंग मुझे एक "तत्व पहले से ही दूसरे तत्व का बच्चा है।" त्रुटि। वहाँ एक तरह से यह चारों ओर है?
टोबियास होफर

5

आप हमेशा ToggleButton के क्लिक पर एक सामान्य घटना का उपयोग कर सकते हैं जो सभी ToggleButton.IsChecked में VisualTreeHelper की मदद से एक Groupcontrol (ग्रिड, WrapPanel, ...) में सेट करता है; फिर प्रेषक को फिर से जांचें। या उस की पसंद में कुछ।

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

आप इसमें रेडियोबुटन के साथ ग्रिड लगा सकते हैं, और रेड्यूयोबुटन के लिए टेम्पलेट जैसा बटन बना सकते हैं। यदि आप बटन को टॉगल नहीं करना चाहते हैं तो सिर्फ प्रोग्राममैटिकली चेक को हटा दें


लेकिन रेडियो बटन का उपयोग करके सभी बटन को रद्द करने का एक तरीका है? एक बार चुने जाने के बाद, मुझे इसे रद्द करने का आसान तरीका नहीं दिख रहा है!
कोड-ज़ूप

RadioButton के पास एक IsChecked प्रॉपर्टी है, आप ज़रूरत पड़ने पर इसे झूठे कोड में सेट कर सकते हैं
Arsen Mkrtchyan

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

मैंने यह RibbonToggleButtons के लिए किया था, लेकिन शायद यह नियमित ToggleButtons के लिए समान है।

मैंने प्रत्येक बटन के लिए IsCTed को EnumToBooleanConverter का उपयोग करके "मोड" एनम वैल्यू के लिए बाध्य किया है यहां से RadioButtons को एनम से कैसे बांधें?(ConverterParameter का उपयोग करके इस बटन के लिए enum मान निर्दिष्ट करें। आपके पास प्रत्येक बटन के लिए एक enum मान होना चाहिए)

फिर पहले से ही जांचे गए बटन को अनचेक करने से रोकने के लिए, रिबन कोड के प्रत्येक के लिए क्लिक करें घटना के लिए इसे अपने कोड में पीछे रखें।

    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}}">
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.