7

मेरे पास RibbonComboBox है जिसका उपयोग फ़ॉन्ट आकार सेट करने के लिए किया जाता है। यह एक RibbonGallery कि विभिन्न फ़ॉन्ट आकार को सूचीबद्ध करता है, उचित FontSize में दिखाया गया है:WPF :: RibbonGomboBox से अलग RibbonGallery से अलग

<r:RibbonComboBox DataContext="{x:Static vm:RibbonDataModel.FontSizeComboBoxData}" 
        SelectionBoxWidth="30"> 
    <r:RibbonGallery MaxColumnCount="1" 
        Command="{Binding Command}" 
        CommandParameter="{Binding SelectedItem}"> 
     <r:RibbonGallery.GalleryItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <TextBlock Text="{Binding}" 
          FontSize="{Binding}" /> 
      </Grid> 
     </DataTemplate> 
     </r:RibbonGallery.GalleryItemTemplate> 
    </r:RibbonGallery> 
</r:RibbonComboBox> 

संपादित यहाँ मेरी ViewModel है:

public static RibbonDataModel 
{ 
    public static GalleryData<object> FontSizeComboBoxData 
    { 
    get 
    { 
     lock (LockObject) 
     { 
      const string key = "Font Size"; 
      if (!DataCollection.ContainsKey(key)) 
      { 
       var value = new GalleryData<object> 
       { 
       Command = HtmlDocumentCommands.ChangeFontSize, 
       Label = "Change Font Size", 
       ToolTipDescription = "Set the font to a specific size.", 
       ToolTipTitle = "Change Font Size", 
       }; 

       var fontSizes = new GalleryCategoryData<object>(); 
       var i = 9.0; 
       while (i <= 30) 
       { 
       fontSizes.GalleryItemDataCollection.Add(i); 
       i += 0.75; 
       } 
       value.CategoryDataCollection.Add(fontSizes); 
       DataCollection[key] = value; 
      } 
      return DataCollection[key] as GalleryData<object>; 
     } 
    } 
    } 
} 

सब कुछ के रूप में की उम्मीद काम करता है, लेकिन मैं किसी आइटम का चयन करने के बाद गैलरी से, यह RibbonComboBox में उसी विशाल (या छोटे) FontSize के साथ गैलरी में उपयोग करता है।

RibbonComboBox में प्रदर्शित होने पर चयनित आइटम के FontSize को डिफ़ॉल्ट रूप से "रीसेट" कैसे कर सकता हूं?

+0

क्या आप अपना व्यूमोडेल कोड पोस्ट कर सकते हैं, कृपया? –

+0

अनुरोध के रूप में पोस्ट किया गया। –

उत्तर

5

RibbonComboBox एक ContentPresenter का उपयोग करता है आइटम आप RibbonGallery में चयन को दिखाने के लिए। इसके अलावा ContentPresenter उसी ItemTemplate को गोद लेता है जिसे आपने RibbonGallery में घोषित किया था। यह आपकी समस्या का "मूल" कारण है।

तो आप समस्या को हल करने के लिए दो समाधानों के बीच चयन कर सकते हैं।

पहला समाधान (सबसे तेजी से एक)

आप बस अपनी RibbonComboBox के लिए "सही" IsEditable गुण सेट कर सकते हैं। इस तरह RibbonComboBox किसी भी आइटम टेम्पलेट का उपयोग किये बिना, ContentPresenter को टेक्स्टबॉक्स के साथ बदल देता है। फिर फ़ॉन्ट का सही आकार होगा।

दूसरा समाधान (सबसे अच्छा एक IMHO)

के बाद से ItemTemplate दोनों RibbonComboBox के ContentPresenter और RibbonGallery से एक ही में प्रयोग किया जाता है, यह बिंदु है जहां हम समस्या को हल करने की कोशिश कर सकते है। ओल्नी अंतर यह है कि जब डेटा टेम्पलेट RibbonGallery के अंदर रखा जाता है, तो उसके माता-पिता RibbonGalleryItem होते हैं। तो यदि उसके माता-पिता RibbonGalleryItem नहीं हैं, तो आप स्वचालित रूप से जानते हैं कि DataTemplate को ContentPresenter के अंदर रखा गया है। आप इस स्थिति को सरल DataTrigger लिखकर संभाल सकते हैं। चलो सभी कोड में देखें।

<Window x:Class="WpfApplication1.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:ribbon="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon" 
     xmlns:vm="clr-namespace:WpfApplication1" 
     Title="Window1" Height="300" Width="300"> 
    <Window.Resources /> 

    <DockPanel> 
     <ribbon:RibbonComboBox Label="Select a font size:" 
        SelectionBoxWidth="62" 
        VerticalAlignment="Center"> 

     <ribbon:RibbonGallery MaxColumnCount="1"> 
       <ribbon:RibbonGalleryCategory DataContext="{x:Static vm:FontSizes.Instance}" ItemsSource="{Binding Path=Values, Mode=OneWay}"> 
        <ribbon:RibbonGalleryCategory.ItemTemplate> 
         <DataTemplate> 
          <Grid> 
           <TextBlock Name="tb" Text="{Binding}" FontSize="{Binding}" /> 
          </Grid> 

          <DataTemplate.Triggers> 
           <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ribbon:RibbonGalleryItem, AncestorLevel=1}}" 
              Value="{x:Null}"> 
            <Setter TargetName="tb" Property="FontSize" Value="12" /> 
           </DataTrigger> 
          </DataTemplate.Triggers> 
         </DataTemplate> 
        </ribbon:RibbonGalleryCategory.ItemTemplate> 
       </ribbon:RibbonGalleryCategory> 
      </ribbon:RibbonGallery> 
     </ribbon:RibbonComboBox> 
    </DockPanel> 
</Window> 

आप देख सकते हैं DataTrigger "घटक" जो "गंदे काम" बनाता है:

namespace WpfApplication1 
{ 
    public class FontSizes 
    { 
     private static FontSizes instance = new FontSizes(); 
     private List<double> values = new List<double>(); 

     public FontSizes() 
     { 
      double i = 9.0; 
      while (i <= 30) 
      { 
       values.Add(i); 
       i += 0.75; 
      } 
     } 

     public IList<double> Values 
     { 
      get 
      { 
       return values; 
      } 
     } 

     public static FontSizes Instance 
     { 
      get 
      { 
       return instance; 
      } 
     } 
    } 
} 

तो यह मेरा दृश्य है:

मैं एक सरल ViewModel लिखा था।

अब आपको केवल उस समाधान के बारे में अपना मनमाने की जरूरत है जो आप पसंद करते हैं।

+0

वह * बिल्कुल * जो मैं ढूंढ रहा था। –

1

मैं आपको माइक्रोसॉफ्ट रिबन के बजाय Fluent.Ribbon लाइब्रेरी का उपयोग करने की सलाह दूंगा (क्योंकि वे बहुत छोटी हैं, अच्छी तरह से बनाए रखा नहीं है और केवल पुरानी शैलियों का समर्थन करते हैं, वास्तव में मुझे इस पर भरोसा है, यह आपको केवल बहुत परेशानी बचाएगा)।

तो आप बस इस कोड का उपयोग कर सकते हैं:

<fluent:ComboBox Header="Font Size" ItemsSource="{Binding FontSizes}"> 
    <fluent:ComboBox.ItemTemplate> 
     <ItemContainerTemplate> 
      <TextBlock FontSize="{Binding }" Text="{Binding }" /> 
     </ItemContainerTemplate> 
    </fluent:ComboBox.ItemTemplate> 
</fluent:ComboBox> 

और वांछित परिणाम प्राप्त करें:

enter image description here

+0

Fluent पर स्विच करते समय। रिबन मुझे कुछ परेशानी बचा सकता है, किसी तृतीय पक्ष लाइब्रेरी के साथ काम करने की स्वीकृति प्राप्त करना कोई आसान काम नहीं है। यह इस समय एक विकल्प नहीं है। –

+0

मैं पहले से ही माइक्रोसॉफ्ट के रिबन के साथ काम कर रहा हूं। फ्लुएंट रिबन घटक का उपयोग करने के लिए, क्या मुझे पूरे रिबन को स्वैप करने की आवश्यकता है? –

+0

यह पूरी तरह से आसान नहीं है, और इस बात पर निर्भर करता है कि आप किस विस्तार का उपयोग कर रहे हैं, इसमें अधिक समय लग सकता है, लेकिन हमारे आवेदन के लिए लगभग 6 अलग-अलग रिबनों में लगभग 3-5 दिन लग गए, लेकिन हमने कई बग हल किए माइक्रोसॉफ्ट के रिबन से संबंधित – Staeff

संबंधित मुद्दे