WPF ToolBar: ग्रिप और ओवरफ्लो को कैसे दूर करें


98

एक नेस्टेड WPF ToolBarPanel-ToolBar-Menu में हम बायें और ओवरफ्लो क्षेत्र को दायें से ग्रिप हैंडल से छुटकारा दिलाना चाहते हैं। वे दोनों धूसर हो गए हैं, लेकिन हम उन्हें प्रदर्शित नहीं करना चाहेंगे।

कैसे पूरा करने पर कोई विचार?

बस अगर मेरी शर्तें पूरी तरह से सही नहीं हैं, अगर आप नीचे दिए गए लिंक के चित्र 3 में छवि को देखते हैं, तो सबसे कम तीन टूलबार पर ड्रॉपडाउन के बाईं ओर और दाईं ओर सबसे दाईं ओर ग्रिप है बटन वहाँ अतिप्रवाह है।

टूलबार की छवि


आप शायद इसे कंट्रोल टेम्पलेट पर ओवरराइट करके कर सकते हैं ... लेकिन मैं इसकी सिफारिश नहीं करूंगा।
अपांदित

आप टूलबार पर Margin = "0,0, -14,0" को दाईं ओर से देखने के लिए पुश कर सकते हैं। यह सबसे आसान उपाय है जो मैंने पाया है, लेकिन मैंने केवल एक टूलबार के साथ परीक्षण किया है जो टूलबारपेल या टूलबार के अंदर नहीं है।
वेन ब्लॉस

जवाबों:


153

ToolBarTray.IsLocked="True"टूलबार पर संलग्न संपत्ति को सेट करके पकड़ को हटाया जा सकता है ।

ओवरफ्लो टॉगलबटन को हटाने के लिए , आपको इसे कस्टम कंट्रोलटेमप्लेट में निकालना होगा क्योंकि सिक्सवर्थवेरीबल्स का सुझाव है, जो कि अगर आपके पास ब्लेंड है या डाउनलोड कर सकते हैं तो 3 पूर्वावलोकन अति कठिन नहीं है।

आप टूलबार के भरी हुई घटना में भी बटन को छिपा सकते हैं, हालांकि आप जो भी रास्ता लेते हैं, आपको ToolBar.OverflowMode="Never"टूलबार के मेनू पर संलग्न संपत्ति भी निर्धारित करनी चाहिए , ताकि आइटम गलती से एक पहुंच से बाहर नहीं हो सकें।

<ToolBarPanel DockPanel.Dock="Top">
    <ToolBar ToolBarTray.IsLocked="True" Loaded="ToolBar_Loaded">
        <Menu ToolBar.OverflowMode="Never">
            <MenuItem Header="File" />
            <MenuItem Header="New" />
        </Menu>
    </ToolBar>
</ToolBarPanel>

और ध्वस्त टॉगल बॉटन को ढहने के लिए सेट करें:

private void ToolBar_Loaded(object sender, RoutedEventArgs e)
{
    ToolBar toolBar = sender as ToolBar;
    var overflowGrid = toolBar.Template.FindName("OverflowGrid", toolBar) as FrameworkElement;
    if (overflowGrid != null)
    {
        overflowGrid.Visibility = Visibility.Collapsed;
    }
    var mainPanelBorder = toolBar.Template.FindName("MainPanelBorder", toolBar) as FrameworkElement;
    if (mainPanelBorder != null)
    {
        mainPanelBorder.Margin = new Thickness();
    }
}

15
प्रश्न पूछता है: टूलबार का उपयोग क्यों करें? सिर्फ बटन के साथ एक साधारण StackPanel का उपयोग क्यों नहीं करें? टूलबार क्या लाभ प्रदान करता है?
जोश जी

5
जोश जी के जवाब में: यदि आप एक सामान्य पैनल (स्टैकपैनल आदि) पर एक छवि के साथ एक पारदर्शी बटन का उपयोग करते हैं, तो इसमें एक सफेद रूपरेखा होगी। जब एक ही बटन टूलबार पर रखा जाता है, तो सफेद रूपरेखा मौजूद नहीं है।
क्रिस बेनेट

2
यह भी उपयोगी है यदि आप इस संदर्भ में एक टूलबार की थीमिंग चाहते हैं, जैसे माउसओवर व्यवहार।
ग्रेग डी

36
FYI करें: आप एक साधारण StackPanel का उपयोग कर सकते हैं और फिर भी टूलबार स्टाइल प्राप्त कर सकते हैं। <Button Style = "{StaticResource {x: Static ToolBar.ButtonStyleKey}}}"> <Image Source = "{StaticResource ZoomIn}"> </ Image> </ Button>
रोमांचक

1
इसके अतिरिक्त मैंने पाया कि यदि आप अपने टूलबार के भीतर <Menu> नियंत्रण का उपयोग नहीं करना चाहते हैं, तो ToolBar.OverflowMode = "Never" संपत्ति सीधे आपके टूलबार के भीतर आपके <Button> नियंत्रण के अंदर सेट की जा सकती है। इससे वह प्रभाव पैदा हुआ जिसकी मुझे तलाश थी
ford

8

आप टूलबार्नेल, मेनू, या टूलबार के लिए कंट्रोलटेम्पलेट को ओवरराइड करने के लिए ब्लेंड का उपयोग कर सकते हैं

  1. टूलबार पर राइट क्लिक करें और एडिट टेम्पलेट चुनें
  2. Edit टेम्पलेट से, एक कॉपी संपादित करें चुनें
  3. मैं एक संसाधन शब्दकोश में प्रतिलिपि जोड़ने की सलाह देता हूं
  4. ओके पर क्लिक करें

अब आप ToolBarPanel के लिए नियंत्रण टेम्पलेट का संपादन करेंगे, और दृश्यता को पकड़ और अतिप्रवाह सिग्नल के लिए Collapsed पर सेट कर सकते हैं। आप अन्य नियंत्रणों के लिए कुल्ला और दोहरा सकते हैं। यह थोड़ा समय लेने वाला है, लेकिन ब्लेंड के साथ बहुत कठिन नहीं है।


जानकारी के लिए धन्यवाद। दुर्भाग्य से मिश्रण 2 और vs2008 हमारे लिए एक साथ अच्छी तरह से काम नहीं करते हैं, बहुत सारी समस्याएं जब एक कोड में दूसरे के साथ काम करता है, तो हम वर्तमान में हमारे बनाम कोड के पास कहीं भी मिश्रण को आने नहीं देते;)
टॉम

1
हाँ, जब तक VS2k8SP1 के आसपास नहीं आया तब तक हमने काफी धार्मिक रूप से ब्लेंड का इस्तेमाल किया। वास्तव में मैं वीएस 2 के 8 डब्ल्यूएएस ब्लेंड में डब्ल्यूपीएफ संपादक की इच्छा करता हूं। बहुत कुछ करने के लिए राइट क्लिक करने में सक्षम होने के लिए और समूह में 'StackPanel' या 'सीमा'। बहुत बुरा एमएस उन्हें अलग अनुभव होना चाहता है।
15:

मुझे लगता है कि नए एक्सएएमएल पावर टॉयज में एक ऐसी सुविधा है जो आपको समूह नियंत्रण की अनुमति देती है। (शायद यह MoXAML पॉवर टॉयज है ...)
नंबर '

8

आप ToolBarनकारात्मक नियंत्रण को हाशिये पर सेट करके एक नए नियंत्रण टेम्पलेट की आपूर्ति किए बिना अतिप्रवाह को "हटा" सकते हैं (और नकारात्मक बाएं मार्जिन में फेंक सकते हैं ताकि यह गोल बाएं किनारों लेकिन चौकोर दाएं किनारों के साथ अजीब न लगे)। उसके बाद, उस टूलबार के किनारों को काट देंगे ClipToBounds="True", ToolBarPanelजो अब पैनल के क्षेत्र के बाहर चिपका हुआ है।

<ToolBarPanel Grid.Row="0" ClipToBounds="True">
    <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0">
    . . .

5

ओवरफ्लो बटन को पूरी तरह से छिपाने के बजाय, मुझे लगता है कि केवल आवश्यक होने पर ही इसे दिखाना बेहतर है। यह अपनी Visibilityसंपत्ति को अपनी IsEnabledसंपत्ति से बांधकर किया जा सकता है :

private static void FixupToolBarOverflowArrow(ToolBar toolBar)
{
    Action fixup = () =>
    {
        var overflowButton = toolBar.Template.FindName("OverflowButton", toolBar) as ButtonBase;
        if (overflowButton != null)
        {
            overflowButton.SetBinding(
                VisibilityProperty,
                new Binding("IsEnabled")
                {
                    RelativeSource = RelativeSource.Self,
                    Converter = new BooleanToVisibilityConverter()
                });
        }
    };

    if (toolBar.IsLoaded)
    {
        fixup();
    }
    else
    {
        RoutedEventHandler handler = null;
        handler = (sender, e) =>
        {
            fixup();
            toolBar.Loaded -= handler;
        };

        toolBar.Loaded += handler;
    }
}

(टेम्प्लेट को फिर से परिभाषित करके XAML में वही काम किया जा सकता है)


3

मैं अभी WPF के साथ शुरुआत कर रहा हूं और अपने ओवरफ्लो तीर (विजुअल स्टूडियो 2010) को छिपाने के लिए उपरोक्त तरीकों में से कोई भी नहीं प्राप्त कर सका। तीर को प्रभावित करने वाली केवल एक चीज ऊपर टूलबार_लॉड उदाहरण थी, लेकिन उस तीर को चालू किया। एक खाली जगह जो तीर की तरह ख़राब दिखती थी। सबसे आसान तरीका मैं समझ सकता था कि टूलबार का मार्जिन सेट करना है।

<ToolBar Height="26" 
         Name="toolBar" 
         DockPanel.Dock="Top" 
         ToolBarTray.IsLocked="True" 
         ToolBar.OverflowMode="Never"        <!-- no effect -->
         Margin="0,0,-13,0">                 <!-- worked -->
         <Menu ToolBar.OverflowMode="Never"> <!-- no affect -->
             <MenuItem Header="_File"></MenuItem>
         </Menu>
</ToolBar>

0

ऊपर के तरीके ओवरफ्लो को छिपाने के लिए काम करते हैं; मैंने ग्रिपर को छिपाने के लिए निम्नलिखित का उपयोग किया है:

         <Label Height="44" Width="30" Background="{StaticResource CtrlBackground}" Margin="-20,0,0,0"></Label>

एक क्षैतिज लेआउट के लिए, और

         <Label Height="44" Width="230" Background="{StaticResource CtrlBackground}" Margin="0,-20,0,0" HorizontalAlignment="Left"></Label>

एक ऊर्ध्वाधर लेआउट के लिए। टूलबार के बाद ऊपर रखें (या टूलबारट्रे, यदि वह उपयोग कर रहा है)

आपके बटनों के लिए जो भी चौड़ाई और ऊँचाई आवश्यक है, उसका उपयोग करें।

Kaxaml इस सामान के साथ खेलने के लिए उत्कृष्ट है।

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